可导航集<String>与<Object>方法参数中的集合不匹配



我有一个方法,它采用Collection<Object>,其中Object可以是StringCustomClass。然后,它获取集合的每个元素,并将其传递给一个参数为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) {
        ...
    }
}

当我把StringCustomClass传给它时,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>之间的继承关系称为"一般协方差"。这并不像AB继承,那么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

马尔科的建议是解决你的问题最简单的方法。

最新更新