泛型

泛型

_

泛型

泛型是在java1.5中提出的一种新的概念。

泛型其实就是一种参数化的集合,它限制了你添加进集合的类型。泛型的本质就是一种参数化类型。多态也可以看着是泛型的机制。

例子:


List arrayList = new ArrayList();
arrayList.add("cxuan");
arrayList.add(100);
for(int i = 0; i< arrayList.size();i++){
 String item = (String)arrayList.get(i);
 System.out.println("test === ", item);
}

这段程序不能正常运行,原因是Integer类型不能强制转换为String类型

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

如果我们用泛型进行改写,示例代码如下

List<String> arrayList = new ArrayList<>();
arrayList.add(100);

这段代码在运行期间就会报错,编译器会在编译阶段就能够帮我们发现问题。

泛型的使用

用泛型表示类

泛型可以加在类上面,来表示这个类的类型

//此处 T 可以随便写为任意标识,常见的如 T、E、K、V
public class GenericDemo<T>{
    //value 这个成员变量的类型为T ,T的类型由外部指定。
    private T value;
    public GenericDemo(T value) {
        this.value = value;
    }
    public T getValue(){ 
        return value;
    }
    public void setValue(T value){
        this.value = value;
    }
}

用泛型表示接口

泛型接口与泛型类的定义以及使用基本相同。

//定义一个泛型接口
public class GenericMethods{
    public  <T> void f(T x){
        System.out.println(x.getClass().getName());
    }
}

泛型通配符

List是泛型类,为了表示各种泛型List的父类,可以使用类型通配符,类型通配符使用<?>表示。它的元素可以匹配任何类型。例如

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("cxuan");
 age.add(18);
 number.add(314);
 generic(name);
 generic(age);
 generic(number); 
}
public static void generic(List<?> data) {
 System.out.println("Test cxuan :" + data.get(0));
}

上界通配符: <? extends ClassType> 该通配符为 ClassType 的所有子类型。 它表示的是任何类型都是ClassType类型的子类型。

下界通配符:<? super ClassType> 该通配符为 ClassType 的所有超类型。 它表示的是任何类型的父类型都是ClassType。

异常 2021-02-08
注解 2021-02-23

评论区