一个带有泛型参数的java方法 - 为什么我不能传递一个带有泛型参数的对象,该参数是方法参数的子类?

Rob*_*ens 4 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 ok
    }
}
Run Code Online (Sandbox Code Playgroud)

但是如果函数只是一个base的对象,它可能需要一个派生对象.为什么是这样?

Col*_*inD 14

func 需要定义为

public void func(List<? extends base> list) { ... }
Run Code Online (Sandbox Code Playgroud)

这是因为a List<derived>实际上并不是a List<base>,因为a List<base>允许其中的任何一种base,而List<derived>只允许derived和它的子类.使用? extends base可确保您不能添加任何东西,但null到了List,因为你不知道什么样的子类base列表可能会允许.

顺便说一下,你应该尝试遵循标准的Java命名约定......以小写字母开头的类看起来很奇怪,就像它们是原始的一样.