表观类型违规,但编译

Jer*_*ome 14 java generics

为什么下面的代码片段会编译?OtherInterface没有扩展,Concrete所以我打赌肾脏,这将无法编译.但确实如此.

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

另一方面,下一个片段不能编译,这是我所期望的.

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Gho*_*ica 5

区别在于:

public static interface OtherInterface{} ...
OtherInterface iCompile = c.getConcrete();
Run Code Online (Sandbox Code Playgroud)

public static class UnrelatedClass{} ...
UnrelatedClass iCompile = c.getConcrete();
Run Code Online (Sandbox Code Playgroud)

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

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

并且错误消息:

原因:类型变量T没有唯一的最大实例,其上限为UnrelatedClass,Concrete

这里非常具体.

换句话说:编译因素在该分配的左侧 - 确定有效类型.并且UnrelatedClass可以永远Concrete-因为该类UnrelatedClass不会延长Concrete!

而东西是SomeInterface可以作为很好落实OtherInterface.


归档时间:

查看次数:

149 次

最近记录:

8 年,8 月 前