Eclipse Java 编译器推断出错误的泛型类型?

丹·贝林代

我想知道这是 ECJ 中的错误还是对 JLS 的有效解释。

import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.function.Supplier;

public class GenericsTest {
    public void testInference() {
        Set<Object> set1 = getCollection(HashSet::new);
        Set<Object> set2 = getCollection2(HashSet::new);
    }

    public static <E, C extends Collection<E>> C getCollection(Supplier<C> collectionSupplier) {
        return collectionSupplier.get();
    }

    public static <E, C extends Collection<E>> C getCollection2(CollectionSupplier<E, C> collectionSupplier) {
        return collectionSupplier.get();
    }

    public interface CollectionSupplier<E, C extends Collection<E>> {
        C get();
    }
}

Javac (11.0.11) 编译一切(正确,我会说)。

ECJ (4.20.0) 无法编译getCollection2(HashSet::new)调用并显示错误“类型不匹配:无法从集合转换为集合”。

getCollection(HashSet::new)对于任何编译器来说调用都不是问题。

如果我应用建议的快速修复并将强制转换插入到HashSet<Object>,我会收到来自 ECJ 的不同错误:“在类型推断期间检测到问题:调用 getCollection2(GenericsTest.CollectionSupplier<Object,Collection>) 时出现未知错误”

这里有很多类似的问题和bugs.eclipse.org 上的错误,但大多数示例似乎都涉及?.

操作

请将您在演员表中遇到的问题报告给 Eclipse JDT。

作为一种解决方法,您可以给 Eclipse 编译器一个提示,如下所示:

Set<Object> set2 = getCollection2((CollectionSupplier<Object, Set<Object>>) HashSet::new);

编译器的棘手部分是检查getCollection2返回的内容是否Set<Object>. 但是为了能够做到这一点,HashSet::new必须知道的类型参数,这是由Set<Object>(在这种情况下,HashSet::new创建 的实例HashSet<Object>)确定的。因此,必须从相反的方向确定类型参数,而不是检查返回类型是否与需要类型参数的声明类型兼容。

看来,Eclipse 无法计算HashSet::new. ObjectHashSet::newstatic class ObjectHashSet extends HashSet<Object> {}作品。GenericsTest::newObjectHashSetwithstatic Set<Object> newObjectHashSet() { return new HashSet<Object>(); }也有效,但失败 static <T> Set<T> newObjectHashSet() { return new HashSet<T>(); }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么Java编译器失去构造函数实例化轨道泛型类型的?

Java泛型:Eclipse中未显示编译器错误

Java编译器无法推断通用链上的类型

使用三元运算符(`?)时,Java是否无法推断出泛型类型参数?

将@SuppressWarnings(“ unchecked”)泛型添加到单行会产生eclipse编译器错误

在哪里配置Eclipse Java编译器(javac)标志?

Eclipse:如何在整个团队中共享Java编译器错误/警告设置

Java Eclipse @Override错误

Java泛型错误:来自命令行编译器的不可转换类型

Java泛型-类型推断

Eclipse Java编译器警告作为ant任务

在Java中转换为泛型方法类型变量时出现编译器警告

Java(Eclipse)-条件编译

Java泛型ECLIPSE错误?

Eclipse使用哪个Java编译器?

Eclipse将编译器设置重置为Java 1.5

为什么Oracle Java编译器不能在这里推断出界限,而Eclipse可以?

可能的Java / Eclipse编译器错误?(不,像往常一样更加愚蠢)

调用泛型方法java的编译器错误

为什么运算符<对于Java泛型有编译器错误?

Eclipse开普勒的Java反编译器

泛型和迭代器的Java编译器错误

Java泛型-编译器错误

Java:递归泛型编译器错误

我的Java编译器1.8在Eclipse中在哪里?

使用Java泛型并将List作为方法参数的编译器错误并引发泛型异常

Java Eclipse显示错误

如何找到Eclipse Java编译器(JDT)的版本?

责任链设计原理中的Java泛型编译器错误