具有泛型参数的java方法-为什么可以';我是否传递了一个带有泛型参数的对象,该参数是方法参数的子类?
我的意思是,在下面的代码中:具有泛型参数的java方法-为什么可以';我是否传递了一个带有泛型参数的对象,该参数是方法参数的子类?,java,generics,Java,Generics,我的意思是,在下面的代码中: class base { } class derived extends base { } class WTF { public void func(List<base> list) { } public void tryit() { func(new List<base>()); // ok func(new List<derived>()); // not
class base {
}
class derived extends base {
}
class WTF {
public void func(List<base> list) {
}
public void tryit() {
func(new List<base>()); // ok
func(new List<derived>()); // not ok
}
}
类基{
}
类派生的扩展基{
}
等级WTF{
公共作废功能(列表){
}
公共无效tryit(){
func(新列表());//确定
func(新列表());//不正常
}
}
但是,如果函数只是获取一个base对象,那么它可以获取一个派生对象。为什么会这样?
func
需要定义为
public void func(List<? extends base> list) { ... }
public void func(List这是因为如果允许传入列表,func()将能够向列表中添加基本类型的元素,从而使列表的泛型约定无效(该约定只允许派生类型的内容)
另一方面,如果将func定义为
public void func(List<? extends base> list)
public void func(List要解释java的这种行为,请看这个示例
void addItem(List<Base> list) {
list.add(new Base());
}
List<Base> l1 = new ArrayList<Base>();
addItem(l1);
Base b = l1.get(0);
List<Derived> l2 = new ArrayList<Derived>();
addItem(l2);
Derived d = l2.get(0); // Would cause runtime exception.
void addItem(列表){
list.add(newbase());
}
列表l1=新的ArrayList();
附加项(l1);
基本b=l1.get(0);
列表l2=新的ArrayList();
附加项(l2);
派生的d=l2.get(0);//将导致运行时异常。
这就是为什么这段代码一开始不会编译