2010-06-10 76 views
2

所以我有3个类。Java泛型的问题

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 

现在类CI有一个方法,是共同的A和B两者,并且因此我不想复制它。我想有一个方法,作为输入类A的一个实例,如下所示:

public void someMethod(List<A> a) 

然而,当我这样做:

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

我得到一个错误,有些法不适用对于参数List<B>,而是期望得到List<A>

有没有很好的方法来解决这个问题? 非常感谢!

+0

这不是一个问题,继承,这是一个仿制药的问题。查看泛型教程。对于这类问题,这是一个很好的参考:http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf – 2010-06-10 18:04:09

+0

你能否包含实际的函数定义和错误的副本? – VeeArr 2010-06-10 18:04:59

回答

8

如果您有期待List<A>的方法,以及一类B extends A,并希望通过这种方法List<B>,那么你应该申报的方法:

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

这使得列表传递给A的列表或扩展B的任何东西。

但请注意,您将无法确定传入该方法的确切类型?。另外,如果您在两个类之间有重复的方法,那么这可能表明某个设计已关闭。

+0

非常感谢!它解决了我的问题。不知道这个选项。 – user247866 2010-06-10 18:10:32

+0

然后继续并接受答案。 – 2010-06-10 18:14:12

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

那么,问题不断得到编辑,所以现在我不知道海报是否尝试使用泛型或不。 – 2010-06-10 18:06:47

+0

编辑冲突methinks。 – 2010-06-10 18:08:10

1

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

你需要的是这样的:

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