这是我的问题。 我想编写一个函数来接受包含给定类及其子类的List。
例如:
class B extends A
class C extends A
我需要一个具有接受A,B和C的List参数的函数。
它只接受B和C
public void f(List<? extends A> list)
它只接受A
public void f(List<A> list)
它如何接受A,B和C?
答案 0 :(得分:1)
这与通用规则有关:
一般来说,如果B扩展A并且你有一个泛型G, 那么
g<a>
无法初始化为
g<B>.
这是因为以下是可能的: class Human和Dog扩展类Animal
public void makeNoise(List<? extends Animal> animalList) {
for (Animal a: animalList) {
//now you could call a.bark() or a.speakAsHuman() and there could not be any verification of whether this is a list of dogs or humans
}
}
看看: this SO Question
答案 1 :(得分:1)
List<? extends A>
接受List<A>
和List<B>
以及List<C>
,它没有任何问题。
答案 2 :(得分:1)
由于Erasure的概念,不能这样做。在运行时,两个'f()'方法看起来都与编译器相同,因此它会抱怨你有两次相同的方法。您必须记住,类型参数在运行时被擦除,因此您有一个类似于以下的方法:
public void f(List list);
因此你不能调用f polymorphicaly,即使这是非法的:
public void f(List<String> list);
public void f(List<Integer> list);
如果您有单独的方法名称,则可以执行以下操作:
public void f(List<? extends A> list);
public void g(List<A> list);
public void h(List<? super B> list);
在方法F中,您可以传递A的任何A或子类型.G将仅需要A对象的列表,并且h将采用b的列表或B的任何超类型。无法指定兄弟类。
一些感兴趣的引用: http://docs.oracle.com/javase/tutorial/java/generics/lowerBounded.html http://docs.oracle.com/javase/tutorial/java/generics/upperBounded.html
答案 3 :(得分:-2)
你不能写一个原型来接受它们,因为List<B>
不是List<A>
的子类。请参阅:Is List<Dog> a subclass of List<Animal>? Why aren't Java's generics implicitly polymorphic?
但是,您可以编写两个原型来接受每个原型:
class c {
public void f(List<? extends A> list);
public void f(List<A> list);
}