我有一个方法,它采用Collection<Object>
,其中Object
可以是String
或CustomClass
。然后,它获取集合的每个元素,并将其传递给一个参数为Object
的方法,如下所示:
public void foo(Collection<Object> c) {
for(Object o : c)
bar(o);
}
public void bar(Object o) {
if(o instanceof String || o instanceof CustomClass) {
...
}
}
当我把String
或CustomClass
传给它时,bar
工作得很好,但当我试图把NavigableSet<String>
传给foo
时,我得到了cannot find symbol; symbol : method foo(java.util.NavigableSet<java.lang.String>)
。
然而,如果我将foo
中的参数类型更改为Collection<String>
,它可以正常工作,但这意味着我需要创建一个新的foo(Collection<CustomClass>)
方法,该方法将涉及重复代码。有办法绕过这个吗?
Collection<String>
不是Collection<Object>
的子类型,因此编译器找不到任何兼容的方法。放入
public <T> void foo(Collection<T> c) {
for (T o : c) bar(o);
}
T<A>
和T<B>
之间的继承关系称为"一般协方差"。这并不像A
从B
继承,那么T<A>
从T<B>
继承那么简单,因为类型参数可能是"in"或"out"(正如C#所说)。
请参见示例http://www.ibm.com/developerworks/java/library/j-jtp01255/index.html或java泛型协方差或http://etymon.blogspot.co.uk/2007/02/java-generics-and-covariance-and.html
马尔科的建议是解决你的问题最简单的方法。