NavigableSet <string>与方法参数</object> </string>中的Collection <object>不匹配

时间:2012-07-17 09:57:11

标签: java overloading

我的方法采用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) {
        ...
    }
}
当我传递barString时,

CustomClass正常工作,但当我尝试将NavigableSet<String>传递给foo时,我得{{1} }}

但是,如果我将cannot find symbol; symbol : method foo(java.util.NavigableSet<java.lang.String>)中的参数类型更改为foo,它可以正常工作,但这意味着我需要创建一个新的Collection<String>方法,该方法将涉及重复代码。有办法解决这个问题吗?

2 个答案:

答案 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.htmljava generics covariancehttp://etymon.blogspot.co.uk/2007/02/java-generics-and-covariance-and.html

Marko的建议是解决问题的最简单方法。