Java 8类型的推理错误?

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定义.