【发布时间】:2015-11-24 11:28:42
【问题描述】:
有谁知道为什么下面的代码在 Java 7 及更低版本中可以正常编译,但在 Java 8 中编译失败。
public static void main(String[] args) throws Exception {
put(get("hello"));
}
public static <R> R get(String d) {
return (R)d;
}
public static void put(Object o) {
System.err.println("Object " + o);
}
public static void put(CharSequence c) {
System.err.println("CharSequence " + c);
}
public static void put(char[] c) {
System.err.println("char[] " + c);
}
get 方法有一个通用的返回类型。在 JDK 7 及以下版本中,它编译得很好,并且选择了带有 Object 参数的 put 方法。在 JDK 8 中无法编译,说明 put 方法不明确。
显然 JDK 8 正在跳过 Object-parameter 方法并找到最后两个子 Object-parameter 方法并抱怨它们(即,如果您添加另一个具有其他参数类型的 put 方法,编译器将切换并抱怨新的最后两种方法)
这似乎是一个错误。
【问题讨论】:
-
你确定吗,用Java7编译得很好,而不是Java8?
-
get方法是假的。你期望R是什么?从分配给的值推断?直接调用put有2种选择,那么应该使用哪个R呢?将未经验证的演员隐藏在泛型后面确实糟糕。 -
这段代码在我的 IDE 上使用 Java 8 编译器编译没有错误。在返回通用 get 方法时,只有关于类型安全的警告
-
为什么一般投一个
String?String是final并直接扩展Object所以您唯一可以将其转换为Object。 -
@Parker,但是
String实现了3个接口,所以你也可以将它转换为任何一个接口...
标签: java generics compiler-errors java-8