接着上一篇:https://blog.csdn.net/danqi1989/article/details/79903262
泛型可不可以泛个List?
直接上测试类:
public class Test {
public static void main(String[] args) {
//泛型变成 List<Animal>
//注意:这里的List<Animal>对应的是泛型Z 不是List<Z>
//所以还是用的setZ方法赋值
Zoo<List<Animal>> zoo = new Zoo<>();
List<Animal> animals = new ArrayList<>();
animals.add(new Animal());
animals.add(new Tiger());
zoo.setZ(animals);
System.out.print(zoo.who());
}
}
直接上结果:
泛型泛的List 能不能以子类代替父类?
package com.nice.dq2020.fanxing;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
//如果泛型是Animal 使用List<Z>的形式
Zoo<Animal> zoo = new Zoo<>();
List<Tiger> animals = new ArrayList<>();
animals.add(new Tiger());
animals.add(new Tiger());
//这里报错了 类型不匹配 怎么办?
zoo.setZs(animals);
//看标题 extends
//Tiger是不是继承的Animal
//将Zoo修改如下
//private List<? extends Z> zs;
//public void setZs(List<? extends Z> zs);
//public List<? extends Z> getZs();
//是不是不报错了
System.out.print(zoo.whos());
}
}
看下结果:两只老虎
泛型泛的List 能不能以父类代替子类?
package com.nice.dq2020.fanxing;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
//如果泛型是Animal 使用List<Z>的形式
Zoo<Tiger> zoo = new Zoo<>();
List<Animal> animals = new ArrayList<>();
animals.add(new Animal());
animals.add(new Tiger());
//这里又报错了 类型不匹配 又怎么办?
zoo.setZs(animals);
//看标题 super
//Animal 是不是 Tiger的父类
//将Zoo修改如下
//private List<? super Z> zs;
//public void setZs(List<? super Z> zs);
//public List<? super Z> getZs();
//是不是不报错了
System.out.print(zoo.whos());
}
}
再看结果:一直动物一只老虎,这里老虎和动物就随意切换了
有种说法 返回值要用extends 参数要用super
说是返回值要取小 取他的子类类型,满足泛型的标准 ,保证取出来的是同一种类型。
传值要传大,传他的父类类型,用 ? super Z
我想问 why?
最后随口说一句,想要定义的泛型能使用某些方法,可以在定义的时候使用泛型继承你的行为基类
比如:
public class Zoo<Z extends Animal
这样 z就能调用Animal的方法了.
搞定,结束!