泛型
- 1.1 泛型的定义
- 1.2 泛型细节
- 2.1 泛型类
- 2.2 泛型方法
- 2.3 泛型接口
- 2.4 泛型的通配符
1.1 泛型的定义
- 泛型的介绍
提供了编译时类型安全检测机制
-
泛型的好处
- 把运行时期的问题提前到了编译期间
- 避免了强制类型转换,造成了代码的不优雅
-
泛型的定义格式
- <类型>: 指定一种类型的格式.尖括号里面可以任意书写,一般只写一个字母.例如:
- <类型1,类型2…>: 指定多种类型的格式,多种类型之间用逗号隔开.例如: <E,T> <K,V>
public class Generics01 {
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
arrayList.add(123);
arrayList.add("abc");
Iterator iterator = arrayList.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
// 多态的弊端就是不能调用子类的特有方法
String str = (String)next;
System.out.println(str.length());
}
}
}
可以看到,我们在集合中可以添加不同类型的元素,但是如果想调用其中一个元素的特有的方法则需要强转,但是这个方法在123这个元素中没有呀,这时,泛型的作用就体现出来了!
ArrayList<String> arrayList = new ArrayList<>();
//arrayList.add(123); // err
arrayList.add("abc");
Iterator<String> iterator = arrayList.iterator();
while (iterator.hasNext()) {
String next = iterator.next();
// 多态的弊端就是不能调用子类的特有方法
System.out.println(next.length());
}
但是需要注意, arrayList.add(123); 是添加不进去的,因为指定了泛型的类型是String,所以只能在集合中添加String类型的元素
1.2 泛型细节
1.泛型中不能写基本数据类型
2.指定泛型的数据类型后,可以传入该类型的子类型和本身
3.如果不写泛型,默认为Object类型
1.可以看到集合中是不能存放基本数据类型的,所以可以存放引用数据类型
2.可以看到当前add方法添加的数据类型为Integer
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
3.这里Tiger是Animal的子类,可以看到,子类是可以传入的
ArrayList<Animal> animals = new ArrayList<>();
animals.add(new Animal("人",16));
animals.add(new Tiger("赔钱虎",20));
这里上下两种写法都是一样的,不指定泛型就默认为object类型
ArrayList<Object> list1 = new ArrayList<>();
ArrayList list2 = new ArrayList();
2.1 泛型类
运行结果
2.2 泛型方法
2.3 泛型接口
List<String>是一个泛型接口,表示该接口可以操作的元素类型是String
2.4 泛型的通配符
泛型不具备继承性,但集合中的数据具备
public class generics01 {
public static void main(String[] args) {
ArrayList<Father> fathers = new ArrayList<>();
ArrayList<Son> sons = new ArrayList<>();
fathers.add(new Father()); // ok
fathers.add(new Son()); // ok
m(fathers);
//m(sons); //err
}
public static void m(ArrayList<Father> arrayList) {
}
}
class Father {
}
class Son extends Father{
}
在m方法中,传递过来的参数只能是 ArrayList<Father> 不能是子类
< ? extends GrandFather> 代表只能传递GrandFather类及其子类
< ? super Father> 代表只能传递Father类及其父类
public class generics02 {
public static void main(String[] args) {
ArrayList<GrandFather> grandFathers = new ArrayList<>();
ArrayList<Father> fathers = new ArrayList<>();
ArrayList<Son> sons = new ArrayList<>();
m1(grandFathers);
m1(fathers);
m1(sons);
m2(grandFathers);
m2(fathers);
// m2(sons); // error
}
/*
< ? extends GrandFather> 代表只能传递GrandFather类及其子类
<? super Father> 代表只能传递Father类及其父类
*/
public static void m1(ArrayList< ? extends GrandFather> arrayList) {
}
public static void m2(ArrayList<? super Father> arrayList) {
}
}