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

我的意思是,在下面的代码中:

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
    }
}

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

最佳答案
func需要定义为

public void func(List<? extends base> list) { ... }

这是因为List< derived>实际上并不是List< base>,因为List< base>允许任何类型的基础,而List< derived>只允许派生及其子类.用? extends base确保您不能向List添加任何空值,因为您不确定列表可能允许的基类.

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

转载注明原文:一个带有泛型参数的java方法 – 为什么我不能传递一个带有泛型参数的对象,该参数是方法参数的子类? - 代码日志