欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java泛型,泛型边界,泛型擦除

程序员文章站 2024-03-14 23:14:11
...
泛型

类型参数化

在不能确定输入类型时使用,更加灵活。泛型接口,泛型方法,泛型类

输入类型一旦确认,之后输入的类型不能更改

List<String> list = new ArrayList<>();
list.add("hello");
list.add(62);//编译报错

一般不以Object作为参数类型。

泛型不能实现方法的重载,可使用通配符,使用后不能添加任何元素

public void method(List<?> list) {
    list.add(null);
	list.add("d");//编译错误,任何类型都不能添加	
}
泛型边界

​ 如果在泛型中使用 extends 和 super 关键字,就可以对泛型的类型进行限制。即:规定泛型的上限下限

//集合里能存放Number类型和它的子类类型(上限)
List<? extends Number> list = new ArrayList();
//集合里能存放Number类型和它的父类类型(下限)
List<? super Number> list2 = new ArrayList();

​ 上限也用在接口,类,方法,变量中

​ 下限只在声明变量时可用

泛型擦除

​ 任何一个使用了泛型之后,在编译的时候擦除了关于泛型的信息。

​ 擦除后变为原始类型Object

List<String> list2 = new ArrayList();
list2.add(new Integer(2));//编译出错,类型不匹配
List list3 = list2;//在编译之后,list2泛型被擦除,List list3 = new ArrayList();
list3.add(new Integer(2));//list3能加入的类型为Object
list3.add("hello");