不明确的构造函数(java 7)......围绕它的唯一方法是构建器模式,对吗?

use*_*121 4 java

这段代码在Java 6下编译得很好,但是当切换到Java 7导致编译时错误时"对Foo的引用是不明确的,com.company.Foo中的构造函数<I,C> Foo(C)和构造函数<I> Foo (I)在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);
}
Run Code Online (Sandbox Code Playgroud)

我明白为什么(集合 Iterables).我打算编写一个Builder辅助类而不是通过提供一个不同命名的构建器方法来区分这两个构造选项来解决这个问题,但在此之前,我想我会问:没有魔法通配符或超级咒语会发生让我离开这个,对吧?

SLa*_*aks 8

你过度使用泛型.

你可以简单地取一个Collection<I>,并且它的任何子类都可以隐式转换为该接口.

实际上,根本不需要类型参数; 你可以写

public Foo(Collection<? extends Iterable<T>> intervalSeries)
public Foo(Iterable<T> intervals)
Run Code Online (Sandbox Code Playgroud)

您可能还想更改T? extends T.