mpo*_*aji 8 java generics java-8
我知道之前已经发布了类似的类型推断问题(Java编译器选择了错误的重载或为什么Java 8泛型类型推断选择了这个重载?)但我认为我们在这里选择了一个更有趣的案例.
public class TemplateMethod {
public static void main(String[] args) {
System.out.println(System.getProperty("java.version"));
method("a", "b");
method("a", 5);
method("a", new B().get());
}
public static void method(String s, String cause) {
System.out.println("String");
}
public static void method(String s, Object parameters) {
System.out.println("Object");
}
public static interface Base {
String methodToImplement();
}
public static class Impl implements Base {
public String methodToImplement() {
return "Impl.methodToImplement";
}
}
public static class B {
public <T extends Base> T get() {
return (T) new Impl();
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
Exception in thread "main" java.lang.ClassCastException:
TemplateMethod$Impl cannot be cast to java.lang.String at
TemplateMethod.main(TemplateMethod.java:9)
Run Code Online (Sandbox Code Playgroud)
我在这里无法理解,如果返回类型是T extends Base什么样的String候选返回类型?
关于StackOverflow的先前问题不涉及像这里的泛型的特殊情况,所以我认为这不是重复.在上面提到的那些情况下,Java8编译器的行为就像编写语言规范一样.在这种情况下,我认为情况并非如此,签名method(String, String)不应该被考虑用于返回类型,T <T extends Base>因为在这里String永远不会TemplateMethod.Base定义.
| 归档时间: |
|
| 查看次数: |
179 次 |
| 最近记录: |