per*_*kin 6 java generics compiler-errors return-type
为什么我不能用Java做到这一点:
public class TestClass {
public <T extends TestClass> T test(){
return this; // error here
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,this
将永远是一个扩展的类的实例TestClass
,为什么编译器不允许上面的代码?即使我会扩展TestClass
当时的类型this
也适合extends TestClass
.我收到以下错误:
错误:(4,16)java:不兼容的类型:TestClass无法转换为T.
说你有SubTestClass extends TestClass
,你写道:
TestClass instance = new TestClass();
SubTestClass result = instance.test();
Run Code Online (Sandbox Code Playgroud)
这是关于你的test()
班级签名的合法,虽然是胡说八道(1).编译器将推断出T
该类SubTestClass
.然后很明显,TestClass
实例不是instanceof SubTestClass
.因此,通过合法使用您的test()
方法,返回this
可能会产生类型不匹配,这就是编译器告诉您的.
使用您的test()
签名,除了之外不可能返回任何其他内容null
,因为这null
是您可以分配给未知类型变量的唯一值.
让我解释一下最后的主张(在评论中提出):test()
方法的实现必须返回一些与T
类型匹配的值,并且具体类型(从调用情况推断出来SubTestClass
)不能用于方法 - 这是参数或实例字段中没有任何内容可以读出SubTestClass
在这种情况下返回a的要求.在另一种呼叫情况下,可能需要返回AnotherSubTestClass
,并且它无法从第二种情况告诉第一种情况.
如果你返回this
(使用(T)
强制转换使其通过编译器),它将在第一个或第二个或两种情况下都失败.因此,如果没有高失败风险,你就无法做到这一点.
您可以成功分配给a SubTestClass
和AnotherSubTestClass
变量的唯一值是null
值.因此,这是您可以从具有此类签名的方法安全返回的唯一值.
(1)有一个泛型方法,其中泛型类型不能从参数中推导出来,而只是从预期的结果类型推导出来,几乎无法工作 - 该方法应该如何知道调用者期望的内容?
归档时间: |
|
查看次数: |
83 次 |
最近记录: |