Java泛型问题

时间:2010-06-10 18:00:09

标签: java generics inheritance oop

所以我有3节课。

Abstract class A 

Class B extends class A

independent Class C

在包含main方法的D类中,我创建了一个B类实例列表

List<B> b =  methodCall(); // the method returns a list of instances of class B

现在在C类中,我有一个A和B共有的方法,因此我不想复制它。我想有一个方法将A类的实例作为输入,如下所示:

public void someMethod(List<A> a)

然而,当我这样做时:

C c = new C();
c.someMethod(b);

我得到一个错误,即某个方法不适用于参数List<B>,而是期望获得List<A>

有解决此问题的好方法吗? 非常感谢!

3 个答案:

答案 0 :(得分:8)

如果您的方法需要List<A>和类B extends A,并且您希望将此方法传递给List<B>,那么您应该将该方法声明为:

public void someMethod(List<? extends A> list)

这允许传递给方法的列表是A的列表或任何扩展B的列表。

请注意,您将无法确定传入方法的?的确切类型。

此外,如果您在两个类之间有重复的方法,那可能表明您的设计出现了问题。

答案 1 :(得分:3)

public void someMethod(List<? extends A> a){ //...

答案 2 :(得分:1)

在您的方法签名中,您有List<A> a,这意味着它只接受A类型的对象列表。您需要的是接受Aany subtype of A(或A的一个子类型)列表的内容。

你需要的是:

public void someMethod(List<? extends A> list) {
  ...
}