List<T> 和 List<?>分别代表什么意思
那是否可以理解List<?> = List ?
以下代码在能编译通过
List<?> getList(){
//...
return null;
} 展开
List<T> 通常指的是泛型的一种情况,而List<?>的使用是在不确定返回的集合泛型是什么类型的情况下所采用的一种方式。?表示是无限制的通配符。参数是可以任何的类型。List<T> list =new List<T>()。
泛型的定义主要有以下两种:
1、在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象。(这是当今较常见的定义)
2、在程序编码中一些包含参数的类。其参数可以代表类或对象等等。(人们大多把这称作模板)不论使用哪个定义,泛型的参数在真正使用泛型时都必须作出指明。
扩展资料
泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。
尽管减少强制类型转换可以降低使用泛型类的代码的罗嗦程度,但是声明泛型变量会带来相应的罗嗦。比较下面两个代码例子。
泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。尽管减少强制类型转换可以降低使用泛型类的代码的罗嗦程度,但是声明泛型变量会带来相应的罗嗦。比较下面两个代码例子。
该代码不使用泛型:
List li = new ArrayList();
li.put(new Integer(3));
Integer i = (Integer) li.get(0);
该代码使用泛型:
List<Integer> li = new ArrayList<Integer>();
li.put(new Integer(3));
Integer i = li.get(0)。
T因为代表是某一确定类型。。所以你可以使用它。。
比如你有个List<T>类型的变量tList 你可以用T t = tList.get(1);也可以用add但是?可以是任意类型。。你不能进行那种与他里面装的东西的类型有关的操作。。比如add get等。。其中get只能复制给object类型。add甚至连object都不能用。。因为他可以是任意类型。。编译器不能确定他是什么类型。。
但前者编译器知道他的类型是T。。
我说的是调用List里的get 和add方法
List<T> 换成 List<Student> list = new ArrayList<Student>();
这个时候list集合就只能装Student类型的值了,你就比喻成家里的装物箱,原本装物箱啥东西都可以往里放,里边的东西装杂了,你去找或取就不方便;这时你就把装物箱分类进行装不同的物品,你想想分类后你要找物品不就容易多啦
List<T>的意思是List的元素都是T这个类型的,List<? extends T>的意思是List的元素是T或者T的子类