当通用静态方法编写如下:
public static <T extends SuperClass> T foo() {
return new SupperClass();
}
,抛出了不兼容的类型编译错误,表明SuperClass
无法转换为T
。
另一方面,当另一个通用的静态方法写成这样:
public static <T extends SuperClass> void bar(T val) {
// do something....
}
使用:bar(new SuperClass())
调用函数时,代码编译得很好。
当使用具有有界泛型类型的泛型类作为其类型参数时,也会发生同样的事情, 无论是返回类型还是函数的参数。
例如,这会导致抛出相同的编译错误:
public static <T extends SupperClass> GenericClass<T> foo() {
return new GenericClass<SuperClass>();
}
表示GenericClass<SuperClass>
无法转换为GenericClass<T>
。但是,这个:
public static <T extends SuperClass> void bar(GenericClass<T> val) {
// do something....
}
使用bar(new GenericClass<SuperClass>)
调用时编译得很好。
所以总结一下这个问题,为什么一个泛型方法的形式类型与某个超类型有界,并且采用这种形式类型的参数,可以用超类型的对象调用,而它不能返回当返回类型被指定为形式类型时,超类型的对象?
提前致谢。
答案 0 :(得分:0)
编译器在进行编译时会查看静态类型。 当你试图返回
时 new SupperClass()
object - 编译器必须确保静态类型匹配 - 并且通过从 SupperClass 转换为 T 来实现。
当你自己做这个时:
(T) new SupperClass()
它会给你一个关于未选中的强制转换的警告 - 因为从技术上讲你可以编程但它的成功取决于运行时类型......
当你返回无效时 - 你什么也没有返回 - 所以不需要进行任何演员。
对施法的评论:施放总是会成功(你可以随时丢失信息),这取决于动态类型并不总是成功。