泛型上下界
<? extends Person>只能取数据
<? super Person>只能存数据
上界,set的时候,我不确定你放什么类,要是放进去的比上界中继承的类还要大,则还要通过向下转型,但是编译器不能向下转型。但是当你get的时候,你放什么子类进去,都可以被继承的父类向上转型取出来。(疑问:要是get的大于继承的类,则不可以通过向下转型出来)
下界,set的时候最低类是super前面写的类,最高是Object,所以你放什么进去都可以通过向上转型放进去。但是get的时候,只能用Object来接收这个get的对象。
泛型
private <T> void print(List<T> lists){
T t = lists.get(0);
for(T o : lists){
System.out.println(o);
}
}
通配符
private void print(List<?> lists){
//因为不确定传入到集合中的元素类型,所以建议get方法用Object去接。
//此时在该方法里面要调用lists.add();方法时,编译报错。除非add里面填null
//原因:不能确定传入的数据的类型。
Object t = lists.get(0);
for(Object o : lists){
System.out.println(o);
}
}
add:除了null之外,不允许加入任何元素!
因为泛型<? extends E>指的是E及其子类,我们不能去诶的那个传入的数据类型
get:可以获取元素,但是必须使用E来接受元素!
因为不管存入什么数据类型都是E的子类型
public class Testda {
public static void main(String[] args) throws Exception{
List<Animal> list = new ArrayList<>();
list.add(new Animal("ad", "公", 2));
list.add(new Animal("dd", "母", 2));
list.add(new Animal("cd", "公", 2));
method(list);
List<Cat> cats = new ArrayList<>();
cats.add(new Cat("ss", "公", 3));
cats.add(new Cat("sd", "公", 3));
cats.add(new Cat("sa", "母", 3));
method(cats);
List<String> k = new ArrayList<>();
k.add("ss");
method(k);//此时编译报错。错因如下图.
//解决方法:此时可以创建一个public static void method(List<String> lists)方法即可。
//错误点:该方法只能接收Animal及其子类的方法。
}
public static void method(List<? extends Animal> lists){
lists.add(new Cat("sa", "母", 3));//该行报错。//此时在该方法里面要调用lists.add();
//方法时,编译报错。除非add里面填null
//原因:不能确定传入的数据的类型。
for(Object o : lists){
System.out.println(o);
}
}
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210719142048281.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1Rocml2ZV9MQ1g=,size_16,color_FFFFFF,t_70)
add:允许添加E和E的子类元素!
get:可以获取元素,但传入的类型可能是E到Object之间的任何类型,也就无法确定接收到数据类型,所以返回只能使用Object引用来接受!如果需要自己的类型则需要强制类型转换。
【注意点:编译器不能向下转型,但是可以向上转型。】
public class Testda {
public static void main(String[] args) throws Exception{
List<Animal> list = new ArrayList<>();
list.add(new Animal("ad", "公", 2));
list.add(new Animal("dd", "母", 2));
list.add(new Animal("cd", "公", 2));
method(list);
List<Cat> cats = new ArrayList<>();
cats.add(new Cat("ss", "公", 3));
cats.add(new Cat("sd", "公", 3));
cats.add(new Cat("sa", "母", 3));
method(cats);//此时编译报错。解决方法:①需要添加public static void method(List<Cat> cats)方法即可。
// ②添加public static void method(List<? super Cat> lists)方法。
//原因:因为下面method方法里面只能接收Animal及其父类。
}
public static void method(List<? super Cat> lists){
lists.add(new Cat("sa", "母", 3));**//【注意点:此时add方法里面允许添加Cat和Cat的子类元素,还有null。**】
lists.add(new BigCat("sa", "母", 3));
lists.add((Cat)new Animal("sa", "母", 3));//虽然可以添加Animal但是是通过向下转型,编译器“不喜欢”。
for(Object o : lists){
System.out.println(o);
}
}
}
public class Animal {
private String name;
private String sex;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Animal(String name, String sex, Integer age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
}
@Override
public String toString() {
return "Animal [name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
}
public class Cat extends Animal{
public Cat(String name, String sex, Integer age) {
super(name, sex, age);
}
}
public class BigCat extends Cat{
public BigCat(String name, String sex, Integer age) {
super(name, sex, age);
}
}