【发布时间】:2019-02-18 12:22:42
【问题描述】:
我正在尝试使用 Maven 编译以下代码:
final Table<Integer, Integer, Integer> destination = HashBasedTable.create();
final Map<Integer, Integer> source = new HashMap<>();
// compiles
final Table<Integer, Integer, Integer> broker =
source.entrySet().stream().collect( Tables.toTable( e -> 0, e -> 0, e -> 0,
( e1, e2 ) -> 0, HashBasedTable::create ) );
destination.putAll( broker );
// doesn't compile
destination.putAll( source.entrySet().stream().collect( Tables.toTable( e -> 0, e -> 0,
e -> 0, ( e1, e2 ) -> 0, HashBasedTable::create ) ) );
结果是错误的:
incompatible types: inferred type does not conform to upper bound(s)
inferred: com.google.common.collect.Table<java.lang.Object,java.lang.Object,java.lang.Object>
upper bound(s): com.google.common.collect.Table<java.lang.Object,java.lang.Object,java.lang.Object>,com.google.common.collect.Table<? extends java.lang.Integer,? extends java.lang.Integer,? extends java.lang.Integer>,java.lang.Object
为什么我需要这个代理表来编译? 最有趣的是 Eclipse 编译器知道如何处理它。
我正在使用 Maven 编译器插件版本 3.8.0,其中 target 和 source 标签设置为 1.8。
我觉得这里的工作流程有问题 - 我在 IDE 中开发,一切看起来都很好,但突然间发现我的代码有问题,甚至无法编译Maven 构建。
我尝试了最新的 3.6 Maven 版本,Eclipse 编译器来自 Eclipse 2018-12,Java 8 和 11。
【问题讨论】:
-
你是如何在你的 pom.xml 中配置 maven-compiler-plugin
-
Eclipse 编译器允许您通过在运行时(而不是编译时)制作故障清单来编译无效代码。当试图运行用 Eclipse 编译器编译的无效代码时,会抛出一些错误。当你运行指定的代码时,你会得到这样的错误吗?
-
@HRgiger 我在问题中包含了相关信息。
-
Maven 使用
javac,而 Eclipse 有自己的编译器。 Here is a similar issue (generic parameter types with bounds) where IMHO Eclipse is right。 Maven 构建中究竟使用了哪个 JDK? Oracle JDK 11.0.2? -
@Line 如果 Oracle JDK 11.0.2 也失败,请确保 Oracle 知道该问题。作为解决方法,请在您的代码中避免这种情况,或者在您的 Maven 构建中使用 Eclipse 编译器。
标签: java eclipse maven generics guava