泛型的概念
所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用是确定。
不用泛型的缺点
ClassCastException
使用泛型的优点
jdk 5.0
时都修改为带泛型的结构。java.lang.Object
。// 在ArrayList中使用泛型
@Test
public void test2() {ArrayList list = new ArrayList();list.add(78);list.add(87);list.add(99);list.add(65);//list.add("Tom"); // 会报错for(Integer score: list) {int stuScore = score;System.out.println(stuScore);}
}
// 在HashMap中使用泛型
@Test
public void test3() {Map map = new HashMap();map.put("Tom", 87);map.put("Jerry", 87);map.put("Jack", 67);//map.put(123, "ABC"); // 会报错// 泛型的嵌套Set> entrys = map.entrySet();Iterator> iterator = entrys.iterator();while(iterator.hasNext()) {Map.Entry e = iterator.next();String key = e.getKey();Integer value = e.getValue();System.out.println(key + "----" + value);}
}
自定义泛型类、接口
泛型类型可能有多个参数,此时应将多个参数一起放在尖括号内。比如:
public class Order {}
泛型类的构造器如下:
// 正确的
public Order() {}
// 错误的
// public Order {}
实例化后,操作原来泛型位置的结构必须与指定的泛型类型一致。
泛型不同的引用不能相互赋值。
ArrayList list1 = new ArrayList<>();
ArrayList list2 = new ArrayList<>();
// 报错
// list1 = list2;
泛型如果不指定,将被擦除,泛型对应的类型均按照Object
处理,但不等价于Object
。经验:泛型要使用一路使用。要不用,一路都不要用。
在类/接口上声明的泛型,在本类或本接口中即代表某种类型,可以作为非静态属性的类型、非静态方法的参数类型、非静态方法的返回值类型。但在静态方法中不能使用类的泛型。
异常类不能是泛型的。
不能使用new T[]
。但是可以T[] arr = (E[]) new Object[capacity]
。
父类有泛型,子类可以选择保留泛型也可以选择指定泛型类型
泛型方法
方法,也可以被泛型化,不管此时定义在其中的类是不是泛型类。在泛型方法中可以定义泛型参数,此时,参数的类型就是传入数据的类型。
泛型方法的格式
[访问权限] <泛型> 返回类型 方法名([泛型标识 参数名称]) 抛出的异常 {}
泛型方法示例
public static List copyFromArrayToList(E[] arr) {ArrayList list = new ArrayList<>();for(E e: arr) {list.add(e);}return list;
}
如果B
是A
的一个子类型(子类或者子接口),而G是具有泛型声明的类或接口,G
并不是G
的子类型!
List
类型通配符:?
List>
是List
、List
等各种泛型List
的父类。
读取List>
的对象list
中的元素时,永远是安全的,因为不管list
的真实类型是什么,它包含的都是Object
。
写入list
中的元素时,不行。因为我们不知道c
的元素类型,我们不能向其中添加对象。
唯一的例外是null
,它是所有类型的成员。
注意点
不能在泛型方法声明上,返回值类型前面<>
不能使用。
public static > void test(ArrayList> list) {}
不能用在泛型类的声明上
class GenericTypeClass> {}
不能用在创建对象上,右边属于创建集合对象。
ArrayList> list2 = new ArrayList>();
有限制的通配符
通配符指定上限:extends
使用时指定的类型必须是继承某个类,或者实现某个接口。即<=
通配符指定下限:super
使用时指定的类型不能小于操作的类,即>=
。
List extends Person> list1 = null;
List super Person> list2 = null;List list3 = new ArrayList();
List list4 = new ArrayList();
List