【发布时间】:2014-05-22 04:42:50
【问题描述】:
我有一段代码在 java 7 下编译得很好,但在 java 8 下编译不好。这是一个独立的复制示例(我采用了展示这个问题的真实代码并删除了所有实现):
import java.util.Iterator;
class ASTNode<T extends ASTNode> implements Iterable<T> {
@Override public Iterator<T> iterator() { return null; }
}
class List<T extends ASTNode> extends ASTNode<T> {}
interface Function<F, T> {}
class Iterables {
public static <F,T> Iterable<T> transform(
Iterable<F> fromIterable, Function<? super F, ? extends T> function) { return null; }
}
class AstFunctions {
public static <T extends ASTNode<?>> Function<T, String> prettyPrint() { return null; }
}
public class Main {
public static void test() {
List<? extends ASTNode<?>> list = null;
Iterables.transform(list, AstFunctions.prettyPrint());
}
}
证人:
$ javac -version
javac 1.8.0_05
$ javac -source 1.7 Main.java
warning: [options] bootstrap class path not set in conjunction with -source 1.7
1 warning
$ javac -source 1.8 Main.java
Main.java:23: error: method transform in class Iterables cannot be applied to given types;
Iterables.transform(list, AstFunctions.prettyPrint());
^
required: Iterable<F>,Function<? super F,? extends T#1>
found: List<CAP#1>,Function<ASTNode<?>,String>
reason: cannot infer type-variable(s) F,T#1,T#2
(argument mismatch; Function<CAP#1,String> cannot be converted to Function<? super CAP#1,? extends String>)
where F,T#1,T#2 are type-variables:
F extends Object declared in method <F,T#1>transform(Iterable<F>,Function<? super F,? extends T#1>)
T#1 extends Object declared in method <F,T#1>transform(Iterable<F>,Function<? super F,? extends T#1>)
T#2 extends ASTNode<?> declared in method <T#2>prettyPrint()
where CAP#1 is a fresh type-variable:
CAP#1 extends ASTNode<?> from capture of ? extends ASTNode<?>
1 error
(也许值得注意的是,配置为兼容 1.8 的 Eclipse 对此代码没有任何问题)。
这是编译器错误吗?如果不是,那么假设我被允许更改AstFunctions 和Main(但不能更改ASTNode、List、Function 或Function 或Iterables),我该如何编译这段代码?如果可能的话,我还想了解 Java 8 类型系统的哪些更改导致此代码无法编译。
【问题讨论】:
-
如果您尝试 Eclipse 的开发版本会发生什么?它可能无法解决编译器错误,但您可能能够从 Eclipse 中获取更多信息而不是破坏它
-
@user3580294 我刚刚尝试使用 4.4RC1 并得到完全相同的内部编译器错误:\
-
哦,真的吗?我强烈建议您提交一份错误报告,因为我认为他们希望在 4.4 上线之前解决这个问题。很遗憾听到这不起作用...
-
老实说,我认为这需要 SO 的 Java 8 专家之一(@BrianGoetz,也许?)来解决。我无法想象有很多人对 Java 的类型推断系统如何工作有足够的了解来快速回答这个问题......
-
@user3580294 我在这里提交了一个错误:bugs.eclipse.org/bugs/show_bug.cgi?id=435463
标签: java eclipse generics java-8