为什么我允许将泛型类型的对象传递给函数,但不允许返回它?

时间:2018-03-06 21:30:17

标签: java generics

当通用静态方法编写如下:

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>)调用时编译得很好。

所以总结一下这个问题,为什么一个泛型方法的形式类型与某个超类型有界,并且采用这种形式类型的参数,可以用超类型的对象调用,而它不能返回当返回类型被指定为形式类型时,超类型的对象?

提前致谢。

1 个答案:

答案 0 :(得分:0)

编译器在进行编译时会查看静态类型。 当你试图返回

new SupperClass()

object - 编译器必须确保静态类型匹配 - 并且通过从 SupperClass 转换为 T 来实现。

当你自己做这个时:

 (T) new SupperClass()

它会给你一个关于未选中的强制转换的警告 - 因为从技术上讲你可以编程但它的成功取决于运行时类型......

当你返回无效时 - 你什么也没有返回 - 所以不需要进行任何演员。

对施法的评论:施放总是会成功(你可以随时丢失信息),这取决于动态类型并不总是成功。