求教java泛型问题

亭子happy 发布于 2012/10/18 22:36
阅读 575
收藏 0

下面这段代码错在哪里呢?

其中Child是Parent的子类。

	public static void main(String[] args) {
		
		Child child = new Child();
		List<Child> childList = new ArrayList<Child>(); 
		childList.add(child);
		
		testList(childList);
		
		Map<String, Child> childMap = new HashMap<String, Child>();
		testMap(childMap);

	}
	
	private static void testList(List<? extends Parent> parent) {
		Child child3 = new Child();
		parent.add(child3);
	}
	
	private static void testMap(Map<String, ? extends Parent> parent) {
		Child child2 = new Child();
		parent.put("test", child2);
	}

加载中
0
NoahX
NoahX
    private static void testList(List<? super Child> parent) {
        Child child3 = new Child();
        parent.add(child3);
    }

    private static void testMap(Map<String, ? super Child> parent) {
        Child child2 = new Child();
        parent.put("test", child2);
    }
NoahX
NoahX
回复 @亭子happy : 统一用List<Parent>来处理逻辑,最好别出现List<Child1>,List<Child2>,List<Child3>。 如: List<Parent> list list.add(child) list.add(parent) Child与Parent有继承关系,但List<Child>与List<Parent>并没有
亭子happy
亭子happy
那么对于这种情况,应该如何实现呢?
0
sxgkwei
sxgkwei
其实就是add和put的地方有错嘛,原因也很简单很容易理解,方法要求是传一个 Parent的子类集合过来,所以你可以传进去一个Child的集合进去,因为你传入的时候已经知道Child是 Parent的子类哈。然后我们来看方法本身,方法本身是确定了你会传一个 Parent的子类进来,但你传进来的时候,肯定这个子类已经是确定的某个子类 a 了对吧,作为一个 Parent 具体子类 a 的集合,那这个集合就只能放具体的那个子类 a,谁都没规定这个 a 就只能是 Child 啊,Parent的子类在java里可以有无数,所以你对集合就放入Child ,就错了。
sxgkwei
sxgkwei
回复 @亭子happy : 。。。无语,不管你现在怎么用,你这个方法,在其它地方可能不可能传个Parent的其它子类进来?你要把方法当作独立的一个它,它又不知道你在哪儿调用它,会给它传一个Parent的什么子类进来,它当然要给你报错啊。
亭子happy
亭子happy
回复 @sxgkwei : 但是我往方法中传的就是Child的list啊,我在方法中还是add的Child,是同一类型的List啊。我没改变成其他类型啊。
sxgkwei
sxgkwei
回复 @亭子happy : 解释完了吖,对这个方法来说,它可不知道Parent有多少个子类A,B,C,D。。所以list可能是list<A>的集合,这个集合内,你放Child怎么能让你放进去呢?
亭子happy
亭子happy
能接着解释一下么?好像没有解释完呢。
0
m
mr_zolo_luffy
* <? extends T>上边界通配符不作为函数入参,只作为函数返回类型,比如List<? extends T>的使用add函数会编译不通过,get函数则没问题
* <? super T>下边界通配符不作为函数返回类型,只作为函数入参,比如List<? super T>的add函数正常调用,get函数也没问题,但只会返回Object,所以意义不大
 
这样设计主要是为了考虑重载,如果允许 <? extends T>上边界通配符作为函数入参,那么List里的add 方法就无法区分传进来的参数匹配哪个重载方法,因为参数都是T的子类
<? super T>则不会有这种问题
0
写bug的程序猿
写bug的程序猿

这个方法只是你知道他是child,但是代码匹配的时候只会认为他是parent的子类,并不知道他是child3这个类,所以add的时候就报错了

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部