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

为什么Oracle Java编译器不能推断出这里的界限,而Eclipse可以?,java,eclipse,generics,compiler-errors,Java,Eclipse,Generics,Compiler Errors,我有这个(看似)无辜的代码(这里简化为这个JUnit测试用例): 我认为从返回类型(Map)以及createMap(相同)的签名可以推断出所需的类型——事实上,Eclipse编译器似乎能够做到这一点。但是,JDK编译器仅推断Map,因此失败 这是JDK bug还是Eclipse编译器bug还是其他什么?这看起来像个bug。我会处理好它,一旦我们有更多关于为什么会发生这种情况的信息,我可能会添加一个更好的答案。我归档了这个bug条目来跟踪它。这确实是一个bug,同样的代码可以用JDK1.8.0u6

我有这个(看似)无辜的代码(这里简化为这个JUnit测试用例):

我认为从返回类型(
Map
)以及
createMap
(相同)的签名可以推断出所需的类型——事实上,Eclipse编译器似乎能够做到这一点。但是,JDK编译器仅推断
Map
,因此失败


这是JDK bug还是Eclipse编译器bug还是其他什么?

这看起来像个bug。我会处理好它,一旦我们有更多关于为什么会发生这种情况的信息,我可能会添加一个更好的答案。我归档了这个bug条目来跟踪它。

这确实是一个bug,同样的代码可以用JDK
1.8.0u66
编译,但不能用我以前用过的
1.8.0u51
编译。

他们似乎已经修复了它。我刚刚做了一些实验。它使用
javac1.8.0_65
进行编译,但不使用
javac1.8.0_25
。我太懒了,找不到修复的确切版本。它不能在Ideone上编译@保尔·伯丁顿谢谢,我会试试的。我们有1.8.0_51,所以这似乎是最近的修复。
import static org.hamcrest.Matchers.instanceOf;
import static org.junit.Assert.assertThat;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.function.Supplier;

import org.junit.Test;

public class GenericsTest {
    private static boolean doFail;

    private static Map<String, Number> createMap() {
        if (doFail) {
            throw new IllegalArgumentException();
        }
        return new HashMap<>();
    }

    public static <T> T get(final Callable<T> _valueCreator, final Supplier<T> _errorValue) {
        try {
            return _valueCreator.call();
        } catch (final Exception e) {
            return _errorValue.get();
        }
    }

    public static Map<String, Number> getCachedMap() {
        return get(GenericsTest::createMap, Collections::emptyMap);
    }

    @Test
    public void testSuccess() {
        doFail = false;
        assertThat(getCachedMap(), instanceOf(HashMap.class));
    }

    @Test
    public void testFail() {
        doFail = true;
        assertThat(getCachedMap(), instanceOf(Collections.EMPTY_MAP.getClass()));
    }
}
.../GenericsTest.java:[23,19] incompatible types: inferred type does not conform to upper bound(s)
inferred: java.util.Map<? extends java.lang.Object,? extends java.lang.Object>
upper bound(s): java.util.Map<java.lang.String,java.lang.Number>,java.lang.Object