泛型

泛型

一、简介

Java泛型是JDK5中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型

泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

二、泛型方法

package com.jp.javaSE.泛型.泛型方法;

import com.sun.org.apache.xml.internal.security.Init;

/**
 * @program: mianjing
 * @description:
 * @author:
 * @create: 2020-10-29 20:30
 **/
public class GenericMethodTest {
    public static void main(String[] args) {
        Integer[] intArray={1,2,3,4,5};
        Double[] doubleArray={1.1,2.2,3.3,4.4};
        Character[] charArray={'H','E','L','L','O'};

        System.out.println("\n整型数组元素为:");
        printArray(intArray);

        System.out.println("\n双精度型数组元素为:");
        printArray(doubleArray);

        System.out.println("\n字符型数组元素为:");
        printArray(charArray);
    }

    //泛型方法 printArray
    public static <E> void printArray(E[] inputArray){
        for(E element : inputArray){
            System.out.printf("%s ", element);
        }
        System.out.println();
    }
}

如果要声明一个有界的类型参数,首先列出类型参数的名称,后跟extends关键字,最后紧跟它的上界。

package com.jp.javaSE.泛型.泛型方法;

/**
 * @program: mianjing
 * @description:
 * @author:
 * @create: 2020-10-29 20:55
 **/
public class MaximumTest {
    public static void main(String[] args) {
        System.out.printf("%d,%d和%d中最大的数为%d\n\n",
                3,4,5,maximum(3,4,5));

        System.out.printf("%.1f,%.1f和%.1f中最大的数为%.1f\n\n",
                6.6,8.8,7.7,maximum(6.6,8.8,7.7));

        System.out.printf("%s,%s和%s中最大的数为%s\n",
                "apple","orange","pear",maximum("apple","orange","pear"));
    }

    public static <T extends Comparable<T>> T maximum(T x,T y,T z){
        T max=x;
        if (y.compareTo(max)>0){
            max=y;
        }
        if (z.compareTo(max)>0){
            max=z;
        }
        return max;
    }
}

三、泛型类

和泛型方法一样,泛型类的类型参数声明部分也包含一个或者多个类型参数,参数间用逗号隔开。

package com.jp.javaSE.泛型.泛型类;

/**
 * @program: mianjing
 * @description:
 * @author: 
 * @create: 2020-10-29 21:07
 **/
public class Box<T> {
    private T t;

    public void add(T t){
        this.t = t;
    }

    public T get() {
        return t;
    }

    public static void main(String[] args) {
        Box<Integer> integerBox=new Box<Integer> ();
        Box<String> stringBox=new Box<String> ();

        integerBox.add(new Integer(10));
        stringBox.add(new String("菜鸟教程"));

        System.out.printf("整数值为:%d\n\n",integerBox.get());
        System.out.printf("字符串为:%s\n",stringBox.get());

    }
}

类型通配符一般是使用?代替具体的参数。例如List<?>在逻辑上是List,List等所有List<具体类型实参>的父类

package com.jp.javaSE.泛型.类型通配符;
import	java.util.ArrayList;
import	java.util.List;

/**
 * @program: mianjing
 * @description:
 * @author: 
 * @create: 2020-10-29 21:20
 **/
public class GenericTest {
    public static void main(String[] args) {
        List<String> name = new ArrayList<String> ();
        List<Integer> age = new ArrayList<Integer> ();
        List<Number> number = new ArrayList<Number> ();

        name.add("icon");
        age.add(18);
        number.add(314);

        getData(name);
        getData(age);
        getData(number);

        //getUperNumber(name);此处行不通,因为已经限制了参数的类型必须为Number
        getUperNumber(age);
        getUperNumber(number);

    }

    public static void getData(List<?> date){
        System.out.println("date:"+date.get(0));
    }

    //限定通配符的上限
    //要声明一个有界的类型参数,首先列出类型参数的名称,后跟extends关键字,最后紧跟它的上界
    public static void getUperNumber(List<? extends Number> data){
        System.out.println("data:"+data.get(0));
    }
}
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页