我花很多时间在学习Java的泛型功能。我尝试阅读以下链接中的解释:https://docs.oracle.com/javase/tutorial/java/generics/bridgeMethods.html,但我不理解,也尝试通过论坛中的以下链接理解该问题:Java Type Erasure: Rules of cast insertion?,但仍然有很长的路要走我,我也添加了评论,但我怀疑是否有人会引用评论,因为该帖子很老。
我试图了解编译器在进行擦除时如何知道对方法返回类型进行哪种类型的转换。在我从《 Deital-Java How to Program》中学到的书中,我认为解释中的某些内容丢失了(也许是错字)。在其中写道:“在每种情况下,从特定方法调用中的方法参数类型推断出返回值的类型转换,因为根据方法声明,
返回类型和参数类型匹配。
据我了解的句子,它说强制转换是根据调用该方法时发送的参数。但是,如果方法没有任何参数。例如,如果方法原型为:
public static <T extends Animal> T funcA ()
现在,有3种不同的方法调用该函数。一个想要获得返回类型(
Dog d = funcA()
)的Dog,第二个想要获得Cat(Cat c = funcA()
),最后一个想要获得Animal(Animal A = funcA()
)。擦除如何决定制作哪种演员?
最佳答案
这实际上与擦除无关。从呼叫站点推断出类型:呼叫者“实际上期望的类型。Animal a = funcA()
等同于Animal a = MyClass.<Animal>funcA()
,Dog d = funcA()
等同于Dog d = MyClass.<Dog>funcA()
。
这是否在实现级别上起作用确实与擦除有关,并且实际上没有有效的funcA
实现-一个没有编译器警告的等效项,或者等效地,一个不会在运行时失败的实现-除了(归结为)return null
。