我的方法采用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) {
...
}
}
当我传递bar
或String
时, CustomClass
正常工作,但当我尝试将NavigableSet<String>
传递给foo
时,我得{{1} }}
但是,如果我将cannot find symbol; symbol : method foo(java.util.NavigableSet<java.lang.String>)
中的参数类型更改为foo
,它可以正常工作,但这意味着我需要创建一个新的Collection<String>
方法,该方法将涉及重复代码。有办法解决这个问题吗?
答案 0 :(得分:5)
Collection<String>
不是Collection<Object>
的子类型,因此编译器找不到任何兼容的方法。把
public <T> void foo(Collection<T> c) {
for (T o : c) bar(o);
}
答案 1 :(得分:0)
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 generics covariance 或http://etymon.blogspot.co.uk/2007/02/java-generics-and-covariance-and.html
Marko的建议是解决问题的最简单方法。