日期:2014-05-20  浏览次数:20725 次

(⊙o⊙)…泛型报错,有谁可以TELL ME WHY?

public class Context<T extends Object> {

private List<T> container = new ArrayList<T>();

public  void add(T visitable){
this.container.add(visitable);
}

public T get(int index){
return this.container.get(index);
}

public static void main(String[] args) {
Context<String> context = new Context<String>();
context.add("");

//我的理解是既然这里通过了,那么下面应该可以添加任何Object
Context<? extends Object> mngContext = new Context<String>();; //1

//在这里应该是可以添加任何对象(因为上面代码已经通过)
//可是不报错的话,系统在get(i)取出来的时候会根本不知道转换成哪种类型
//我觉得上面1处代码不应该通过,可咋么滴就通过了哈?
mngContext.add(new Manager());  //eclipse下这里报错
}
}

------解决方案--------------------
你的理解是错误的,?是指定义时不确定类型,通过下文推断类型,在mngContext =  new Context<String>()这里已经在赋值的时候确定出是参数String类型了,后面添其他类型肯定就报错
------解决方案--------------------
你这样定义mngContext ,是想针对所有Object的子类做的泛型,但是对于java来说根本无法断定这个具体类型是什么,因为Object的子类无法确定,所以没有办法add任何类型,但是他的get却可以返回Object类型,因为mngContext 里面都是Object的子类,所以取值可以将元素向上转型为Object。