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");
上一篇: [Java] Java 泛型
下一篇: C# 泛型---创建泛型类(例子)