java - 模棱两可的构造函数(java 7)...解决此问题的唯一方法是构建器模式,对吗?

标签 java

此代码在 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/

相关文章:

javascript - vert-x 3.3.2 http客户端异常处理程序

Java 在新线程中运行静态方法

java - 如何从 Eclipse ColorRegistry 中删除条目?

java - 我可以向 Solr 服务器动态提供 solrconfig.xml 和 schema.xml 文件吗?

java - 多个 JPanel 未打印在背景前面

java - 如何将Java中的Map对象保存到MySQL数据库中

java - 如何使用 Eclipse 和 Maven 配置 Java 项目以连接到 Amazon RDS

java - Mybatis log4j如何配置log4j以将sql日志打印到文件

java - 使用 MappedSuperclass 和 OpenJPA 时出现 NoClassDefFoundError

java - 使用 XMLUnit 2.X 比较 xml 文件时忽略特定节点的特定属性