我有这个(看起来)无辜的代码(这里简化成这个JUnit测试用例):
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()));
}
}
问题在于return-get(GenericsTest::createMap,Collections::emptyMap)
行:Eclipse编译器在这里没有发现问题(我也是),很高兴编译并运行测试并成功。
但是,当我在命令行上编译它时(在这种情况下是Maven 3,Oracle JDK8,但也不能直接与javac一起使用),会抛出一个编译错误:
.../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
我认为从返回类型(< code>Map
这是JDK的错误还是Eclipse编译器的错误还是别的什么?
这确实是一个bug,同一代码在JDK1.8.0u66
中编译得很好,但在我之前使用的1.8.0u51
中编译得不好。
这看起来像一个错误。我会处理它,一旦我们有了更多关于为什么会发生这种情况的信息,可能会添加一个更好的答案。我已将此bug条目JDK-8043926归档以跟踪它。
我有一个简单的测试设置,如 但当我尝试编译测试时,我会遇到53个错误,比如 实际上并没有传达任何关于问题所在的有用信息。我只能假设在我的构建中没有正确配置某些内容。sbt文件或其他地方。 这段代码确实曾经工作过,在我清理东西的过程中,事情发生了变化,现在它被破坏了,没有好的诊断。 有人能提出要找的东西吗?
为什么 C 编译器可以将函数声明为 constexpr,而 constexpr 不能是 constexpr? 例如:http://melpon.org/wandbox/permlink/AGwniRNRbfmXfj8r 输出: 为什么此行出错:
背景:我最近写了一个答案,建议编写以下代码: 经过一番思考,我说:“我实际上不需要这里的列表,我只需要一个<代码>Iterable (对于这个问题,我将其提取到一个局部变量,我想在最后内联完成。) 很遗憾,如果没有其他类型提示,则无法编译: 当然,添加一些类型提示可以实现这一点: 据我所知,Java编译器执行以下操作: 它查看表达式的目标类型,它是可编辑的 有趣的是,如果我将lambda的目标更改
以下程序在Java7和Eclipse Mars RC2中编译Java8: 使用javac 1.8.0_45编译器,报告了以下编译错误: 解决方法是在本地分配一个变量: 我知道类型推断在Java8中发生了很大变化(例如,由于JEP 101“广义目标类型推断”)。那么,这是一个错误还是一个新的语言“功能”? 编辑:我也向Oracle报告了JI-9021550,但以防万一这是Java8中的一个“功能”,
奇怪的是,标记为“OK”的行编译得很好,但标记为“Error”的行失败了。它们看起来基本上是一样的。