为什么下面的代码片段会编译?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)
区别在于:
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 次 |
| 最近记录: |