public static void main(String[] args) {
/*
泛型不具备继承性,但是数据具有继承性
*/
//创建集合的对象
ArrayList<ye> list1=new ArrayList<>();
//ArrayList<fu> list2=new ArrayList<>();
//ArrayList<zi> list3=new ArrayList<>();
//调用method
method(list1);
//method(list2);报错
//method(list3);报错
//数据具有继承性
list.add(list1);
list.add(list2);
list.add(list3);
}
public static void method(ArrayList<ye> list){}
}
class ye{}
class fu extends ye{}
class zi extends fu{}
泛型不具备继承性,但是数据具备继承性
方法调用时,父类泛型只能接受本类型的对象,不可以接受继承于父类的子类对象。
数据具备继承性,集合添加数据时可以是子类类型。
泛型的通配符
想要在集合中传入什么类型的数据,加入泛型进行限制。
弊端:
泛型里写的是什么类型的数据,就只能传输什么类型的数据,不可以传入多个类型的数据
利用泛型方法有一个小弊端,此时他可以接受任意的数据类型
希望:
本方法虽然不确定类型,但是只希望能传递ye fu zi
但泛型不具备继承性,不可以使用ye
解决方案:
此时我们可以使用泛型的通配符:
?也表示不确定的类型
他可以进行类型的限定
?extends E:表示可以传递E或者E的所有子类型
?super E:表示可以传递E或者E所有的父类型
应用场景:
1、如果我们在定义类、方法、接口的时候,如果类型不确定,就可以定义泛型类、泛型方法、泛型接口
2、如果类型不确定,但是能知道以后只能传递某个继承体系中的,就可以使用通配符
关键点:
可以限定类型的范围。
public static void main(String[] args) {
ArrayList<ye> list1=new ArrayList<>();
ArrayList<fu> list2=new ArrayList<>();
ArrayList<zi> list3=new ArrayList<>();
method(list1);
method(list2);
method(list3);
}
/*
此时泛型里写的是什么类型的数据,就只能传输什么类型的数据
弊端:
利用泛型方法有一个小弊端,此时他可以接受任意的数据类型
希望:本方法虽然不确定类型,但是只希望能传递ye fu zi
但泛型不具备继承性,不可以使用ye
此时我们可以使用泛型的通配符:
?也表示不确定的类型
他可以进行类型的限定
?extends E:表示可以传递E或者E的所有子类型
?super E:表示可以传递E或者E所有的父类型
应用场景:
1、如果我们在定义类、方法、接口的时候,如果类型不确定,就可以定义泛型类、泛型方法、泛型接口
2、如果类型不确定,但是能知道以后只能传递某个继承体系中的,就可以使用通配符
泛型的通配符:
关键点:可以限定类型的范围。
*/
public static<E> void method(ArrayList<E> list){}
public static void method1(ArrayList<? extends ye> list){
}