Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有泛型参数的java方法-为什么可以';我是否传递了一个带有泛型参数的对象,该参数是方法参数的子类?_Java_Generics - Fatal编程技术网

具有泛型参数的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);//将导致运行时异常。
这就是为什么这段代码一开始不会编译