JAVA------通配符篇(上下界)

通配符

泛型上下界
<? 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之外,不允许加入任何元素!
因为泛型指的是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 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 cats)方法即可。
											// ②添加public static void method(List 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);
		
	}

}

欢迎各位大佬指正!!!!!!!!!!!!!!!

你可能感兴趣的:(java,windows,开发语言)