泛型 -Java

泛型

一、集合中的泛型

不使用泛型带来的问题:

ArrayList 默认接受Object类型的对象,所以所有对象都可以放进ArrayList中;
接着,需要进行强制转换才可以得到English类型或者Math类型;
如果程序员记忆比较好,能记得哪个是哪个,还是可以的;
但是,比如第10行,把第1个对象转换为English,这样就会出现类型转换异常 。

public class TestGeneric {
	public static void main(String[] args) {
		
		List schoolWork = new ArrayList();
		
		schoolWork.add(new English());
		schoolWork.add(new Math());
		
		English eng = (English) schoolWork.get(0);
		English eng1 = (English) schoolWork.get(1);  //1对应Math,会出现异常
	}
}

使用泛型

泛型的用法是在容器后面添加
Type可以是类,抽象类,接口。

public class TestGeneric {
	public static void main(String[] args) {
		
		List<English> schoolWork = new ArrayList<>();
		
		schoolWork.add(new English());
		// schoolWork.add(new Math());	其他类型放不进去
	}
}

子类对象

如上代码,如果Math是English的子类,那么English泛型的容器是可以放进去Math类对象的。

二、通配符

?extends

//假设Math和English是Chinese的子类
List<?extends Chinese> schoolWork = new ArrayList<>();//表示这是一个Chinese泛型或其子类泛型
//schoolWork 的泛型有可能是Chinese、Math或者是English
//也就是说取出来一定可以转成Chinese类,但却不可以放进去对象

?super

//假设Math和English是Chinese的子类,Chinese是Object的子类
List<?super Chinese> schoolWork = new ArrayList<>();  //表示这是一个Chinese泛型或其父类泛型
//schoolWork 的泛型可能是Chinese或者是其父类Object
//也就是说可以放进去Chinese类对象或者Math和English类对象,但却无法取出,因为Object强转Chinese是会失败的

?

List<?> schoolWork = new ArrayList<>();  //表示这是一个任意类泛型
//也就是说只能以继承树顶类型取出对象,却无法放进去对象

总结

如果希望只取出,不插入,就使用? extends
如果希望只插入,不取出,就使用? super
如果希望,又能插入,又能取出,就不要用通配符?

相关ArrayList知识请点击这里

原文地址:https://www.cnblogs.com/zx224569/p/12972389.html