我有以下情况:
public class A {...};
public class B extends A {...};
然后我在class C
内部定义了一个带有以下标头的函数:
private void handleABC(final Collection<A>) {...}
但是当我尝试通过类型B
来调用它时,我收到以下消息:
类型C的handleABC(Collection)方法不适用于参数(Collection)。
由于我定义了方法A
和B
从Collection<A>
扩展而来的B
和A
都不能使用吗?我在做什么错了?
答案 0 :(得分:3)
B extends A
是的,但Collection<B> extends Collection<A>
并非如此。
如某人在评论中所述,请尝试Collection<? extends A>
。
答案 1 :(得分:2)
将handleABC()
签名更改为
private void handleABC (final Collection<? extends A> )
以便该方法接受A的子类的集合。
答案 2 :(得分:0)
您必须传递在菱形运算符中指定的类,而不是具体的类,否则您可以使用“?扩展A”。您可以阅读以下链接:https://docs.oracle.com/javase/tutorial/java/generics/inheritance.html
答案 3 :(得分:0)
请查看以下答案:https://stackoverflow.com/a/897973/3465242
<T extends SomeClass>
当实际参数可以是SomeClass或其任何子类型时。
以您的情况
private void handleABC (final Collection<? extends A> )