明显的类型冲突,但编译

2022-09-04 04:27:51

为什么下面的代码段会编译? 不会扩展,所以我敢打赌一个肾脏,这不会编译。但事实确实如此。OtherInterfaceConcrete

public class Test {

    public static interface SomeInterface {}

    public static interface OtherInterface{}

    public static class Concrete implements SomeInterface {

       public <T extends Concrete> T getConcrete() {
            return null;
       }
    }

    public static void doStuff() {
        Concrete c = new Concrete();
        OtherInterface iCompile = c.getConcrete();
    }
}

另一方面,下一个代码段不会编译,这是我所期望的。

public class Test {

    public static interface SomeInterface {}

    public static class UnrelatedClass{}

    public static class Concrete implements SomeInterface {

       public <T extends Concrete> T getConcrete() {
            return null;
       }
    }

    public static void doStuff() {
        Concrete c = new Concrete();
        UnrelatedClass iCompile = c.getConcrete();
    }
}

答案 1

区别就在这里:

public static interface OtherInterface{} ...
OtherInterface iCompile = c.getConcrete();

与。

public static class UnrelatedClass{} ...
UnrelatedClass iCompile = c.getConcrete();

含义:在第一种情况下,调用该方法以返回某个接口的实例。接口可以是任何类。

在第二个示例中,您指示返回的类型是特定类!一个已知的类,并且实现其他接口!

和错误消息:

原因:对于上限为不相关类的类型变量 T,不存在唯一的最大实例,具体

在这里非常具体。

换句话说:编译器将因子放在该赋值的左侧 - 以确定有效类型。并且永远不可能是 - 因为类扩展!UnrelatedClassConcreteUnrelatedClassConcrete

而某些东西也可以实现SomeInterfaceOtherInterface


答案 2

推荐