此代码在 Java 6 下编译良好,但当切换到 Java 7 时会导致编译时错误“对 Foo 的引用不明确,com.company.Foo 中的构造函数 Foo(C) 和构造函数 < I>Foo(I) in com.company.Foo 匹配"
/**
* Constructor A - acts on a Collection of Iterables
*/
public <I extends Iterable<T>, C extends Collection<I>> Foo(C intervalSeries) {
initialize(intervalSeries);
}
/**
* Constructor B - convenience constructor for callers who only have 1 Iterable
*/
public <I extends Iterable<T>> Foo(I intervals) {
List<I> intervalSeries = newArrayList(1);
intervalSeries.add(intervals);
initialize(intervalSeries);
}
我明白为什么(集合是 Iterables)。我计划编写一个 Builder 帮助程序类,而不是通过提供一个不同名称的构建器方法来区分这两个构造选项来解决这个问题,但在我这样做之前我想我会问:没有魔法通配符或 super 咒语会让我离开这里,对吧?
最佳答案
你过度使用了泛型。
你可以简单地拿一个Collection<I>
,并且它的任何子类都可以隐式转换为该接口(interface)。
事实上,你根本不需要类型参数;你可以写
public Foo(Collection<? extends Iterable<T>> intervalSeries)
public Foo(Iterable<T> intervals)
您可能还想更改 T
至 ? extends T
.
关于java - 模棱两可的构造函数(java 7)...解决此问题的唯一方法是构建器模式,对吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19409541/