自定义泛型类
public class Order<E> {
private String name;
private int age;
private E order;
public Order(){}
public Order(String name,int age,E order){
this.name = name;
this.age = age;
this.order = order;
}
}
自定义泛型方法
public <T> List<T> copyList(T[] arr){
ArrayList<T> list = new ArrayList<>();
for(T t : arr){
list.add(t);
}
return list;
}
泛型类继承注意点
- A类是B类的父类,但是G不是G的父类,两者属于平行关系
- A类是B类的父类,A
是B 的父类
通配符的使用
- 当A类是B类的父类,但是G不是G的父类,两者属于平行关系,可以定义他们的父类都是G<?>
@Test
public void test04(){
List<Object> list1 = null;
List<String> list2 = null;
//这里将list2赋值给list1会报错
//list1 = list2;
//引入通配符"?"来充当两者的父类
List<?> list = null;
list = list1;
list = list2;
print(list1);
print(list2);
}
public void print(List<?> list){
Iterator<?> iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
- 使用List<?> list时,不能往里面添加元素,但是可以读取元素
@Test
public void test05(){
List<String> list1 = new ArrayList<>();
list1.add("aa");
list1.add("bb");
list1.add("cc");
List<?> list = list1;
//使用通配符的情况下,不能往集合中添加数据!
//list.add("dd");
//但是可以读取数据
Object o = list.get(0);
System.out.println(o);
}
限制通配符的范围
- ? extend 类型:赋值的时候,泛型类型要小于等于该类型
- ? super 类型:赋值的时候,泛型类型要大于等于该类型
@Test
public void test06(){
List<? extends Order> list1 = null;
List<? super Order> list2 = null;
list1 = new ArrayList<Order>();
//list1 = new ArrayList<Object>(); //编译报错
list1 = new ArrayList<subOrder>();
list2 = new ArrayList<Order>();
list2 = new ArrayList<Object>();
//list2 = new ArrayList<subOrder>(); //编译报错
//读取
Order order = list1.get(0); //此方法读取数据转化类型必须大于等于Order
Object object = list2.get(0); //list2读取数据只能用Object接收
//写入
//list1.add(new subOrder()); //list1不允许写入数据
list2.add(new Order()); //list允许写入数据类型必须小于等于Order
}