Code Bye

集合泛型通配符的一个小问题,请教一下各位大侠

 

为什么A 不能选啊? 


20分
List<? extends String> list

你要理解这个形参的意思,是说你不加泛型,list里面可以存放任意类型的元素,但是一旦加上泛型作为类型限制,list就只能存放某种类型的数据。
这里list中存放继承String类的某一个子类,而继承String类的子类又不确定,你怎么就能决定list中add什么类型的数据呢。

就像一个人有三个孩子,你想给二儿子100块钱,现在你都不知道谁是二儿子,就知道他有三个儿子,你怎么给。

你肯定郁闷,老是觉得既然不能放字符串,D怎么就对了呢,这么给你说吧,你声明类型的时候是否可以用接口代替实现类,要是你很容易理解这个,那这个是同样道理,真不理解的话,你可以在list = new ArrayList<String>();后面继续写,list.add(“xxoo”);你会发现同样报错,以为这个泛型只是声明

string是最终类 ,能有子类? 
2楼正解
你可以写个demo感受下
public void test(List<? extends String> list){
		list.add("");
	}

eclipse中,直接报错,毫无悬念

引用 1 楼 u011213572 的回复:
List<? extends String> list

你要理解这个形参的意思,是说你不加泛型,list里面可以存放任意类型的元素,但是一旦加上泛型作为类型限制,list就只能存放某种类型的数据。
这里list中存放继承String类的某一个子类,而继承String类的子类又不确定,你怎么就能决定list中add什么类型的数据呢。

就像一个人有三个孩子,你想给二儿子100块钱,现在你都不知道谁是二儿子,就知道他有三个儿子,你怎么给。

你肯定郁闷,老是觉得既然不能放字符串,D怎么就对了呢,这么给你说吧,你声明类型的时候是否可以用接口代替实现类,要是你很容易理解这个,那这个是同样道理,真不理解的话,你可以在list = new ArrayList<String>();后面继续写,list.add(“xxoo”);你会发现同样报错,以为这个泛型只是声明

String类定义是final呀~是终结类啊~

引用 1 楼 u011213572 的回复:
List<? extends String> list

你要理解这个形参的意思,是说你不加泛型,list里面可以存放任意类型的元素,但是一旦加上泛型作为类型限制,list就只能存放某种类型的数据。
这里list中存放继承String类的某一个子类,而继承String类的子类又不确定,你怎么就能决定list中add什么类型的数据呢。

就像一个人有三个孩子,你想给二儿子100块钱,现在你都不知道谁是二儿子,就知道他有三个儿子,你怎么给。

你肯定郁闷,老是觉得既然不能放字符串,D怎么就对了呢,这么给你说吧,你声明类型的时候是否可以用接口代替实现类,要是你很容易理解这个,那这个是同样道理,真不理解的话,你可以在list = new ArrayList<String>();后面继续写,list.add(“xxoo”);你会发现同样报错,以为这个泛型只是声明

你好,对于你讲到的
“这里list中存放继承String类的某一个子类,而继承String类的子类又不确定,你怎么就能决定list中add什么类型的数据呢”

我自己的理解是:
String是final类型,也就是说不可能有子类,而<? extends String>的意思是说 这里只能存入String的子类才行
所以没有任何一个对象满足上述条件
也就是List<? extends String> list  的size()永远返回的是0,
这也是为什么楼主疑惑的A不能选的原因


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明集合泛型通配符的一个小问题,请教一下各位大侠