为什么参数类型扩展String不能像String一样使用

时间:2014-07-07 22:56:08

标签: java generics

假设我有这样的代码

class B<T extends String>
{
    T f(T a){
        return a+"def";
    }
}

为什么它会给我一个编译时错误&#34;错误:不兼容的类型&#34;?为什么我不能像String一样使用扩展String的东西?

2 个答案:

答案 0 :(得分:4)

+运算符应用于String,其他任何内容都是String并置运算符,并生成String

您的返回类型为T,而不是StringT可能(不会,但理论上可以)是String的任何子类型。因此,不允许编译。

同样,

class Foo {}
class B<T extends Foo> {
    T f(T a) {
        return new Foo();
    }
}
class Bar extends Foo {}

new B<Bar>().f(new Bar());

的返回类型应为Bar,但会返回Foo。这没有意义,所以不编译。

答案 1 :(得分:-1)

Stringfinal,没有什么可以扩展它,所以你的通用类&#39;定义并不真正有用。我很惊讶<T extends String>编译。