列出泛型及其自身及其子类

时间:2014-01-07 21:16:46

标签: java generics inheritance

这是我的问题。 我想编写一个函数来接受包含给定类及其子类的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?

4 个答案:

答案 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);
}