Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么参数类型扩展字符串可以';不要像绳子一样使用_Java_Generics - Fatal编程技术网

Java 为什么参数类型扩展字符串可以';不要像绳子一样使用

Java 为什么参数类型扩展字符串可以';不要像绳子一样使用,java,generics,Java,Generics,假设我有这样的代码 class B<T extends String> { T f(T a){ return a+"def"; } } B类 { tf(ta){ 返回一个+“def”; } } 为什么它会给我一个编译时错误“错误:不兼容类型”?为什么我不能使用像字符串一样扩展字符串的东西?应用于字符串的+运算符,其他任何东西都是字符串串联运算符,并生成字符串 您的返回类型是T,而不是StringT可以(不会,但理论上可以)是String的任何子类型

假设我有这样的代码

class B<T extends String>
{
    T f(T a){
        return a+"def";
    }
}
B类
{
tf(ta){
返回一个+“def”;
}
}

为什么它会给我一个编译时错误“错误:不兼容类型”?为什么我不能使用像字符串一样扩展字符串的东西?

应用于
字符串的
+
运算符,其他任何东西都是
字符串
串联运算符,并生成
字符串

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

同样地

class Foo {}
class B<T extends Foo> {
    T f(T a) {
        return new Foo();
    }
}
class Bar extends Foo {}
class Foo{}
B类{
tf(ta){
返回新的Foo();
}
}
类栏扩展了Foo{}
但是

newb().f(newbar());

返回类型应为
Bar
,但将返回
Foo
。这没有意义,因此无法编译。

应用于
字符串的
+
运算符,其他任何操作都是
字符串
串联运算符,并生成
字符串

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

同样地

class Foo {}
class B<T extends Foo> {
    T f(T a) {
        return new Foo();
    }
}
class Bar extends Foo {}
class Foo{}
B类{
tf(ta){
返回新的Foo();
}
}
类栏扩展了Foo{}
但是

newb().f(newbar());

返回类型应为
Bar
,但将返回
Foo
。这没有意义,因此无法编译。

应用于
字符串的
+
运算符,其他任何操作都是
字符串
串联运算符,并生成
字符串

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

同样地

class Foo {}
class B<T extends Foo> {
    T f(T a) {
        return new Foo();
    }
}
class Bar extends Foo {}
class Foo{}
B类{
tf(ta){
返回新的Foo();
}
}
类栏扩展了Foo{}
但是

newb().f(newbar());

返回类型应为
Bar
,但将返回
Foo
。这没有意义,因此无法编译。

应用于
字符串的
+
运算符,其他任何操作都是
字符串
串联运算符,并生成
字符串

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

同样地

class Foo {}
class B<T extends Foo> {
    T f(T a) {
        return new Foo();
    }
}
class Bar extends Foo {}
class Foo{}
B类{
tf(ta){
返回新的Foo();
}
}
类栏扩展了Foo{}
但是

newb().f(newbar());

返回类型应为
Bar
,但将返回
Foo
。这没有意义,因此无法编译。

String
final
,没有任何东西可以扩展它,因此泛型类的定义不是很有用。我很惊讶
是编译的。

字符串
最终的
,没有任何东西可以扩展它,所以泛型类的定义并没有真正的用处。我很惊讶
是编译的。

字符串
最终的
,没有任何东西可以扩展它,所以泛型类的定义并没有真正的用处。我很惊讶
是编译的。

字符串
最终的
,没有任何东西可以扩展它,所以泛型类的定义并没有真正的用处。我对编译的
感到惊讶。

String
是最终的;我甚至不确定编译器是否会允许您编写
T扩展字符串
。您也不能扩展整数等。它们是神圣的。但仅使用“return a;”就可以完美编译。为了清楚起见,
是毫无意义的。这实际上转化为
String
(因为@LouisWasserman提到的原因)。这会使该类的泛型组件变为惰性组件,因此您不妨先为字符串编写它。这也会解决你(其他)的问题。这是一个考试的例子,所以是一个理论上的例子。但我仍然不认为编译器允许扩展字符串有任何意义。
String
是最终的;我甚至不确定编译器是否会允许您编写
T扩展字符串
。您也不能扩展整数等。它们是神圣的。但仅使用“return a;”就可以完美编译。为了清楚起见,
是毫无意义的。这实际上转化为
String
(因为@LouisWasserman提到的原因)。这会使该类的泛型组件变为惰性组件,因此您不妨先为字符串编写它。这也会解决你(其他)的问题。这是一个考试的例子,所以是一个理论上的例子。但我仍然不认为编译器允许扩展字符串有任何意义。
String
是最终的;我甚至不确定编译器是否会允许您编写
T扩展字符串
。您也不能扩展整数等。它们是神圣的。但仅使用“return a;”就可以完美编译。为了清楚起见,
是毫无意义的。这实际上转化为
String
(因为@LouisWasserman提到的原因)。这会使该类的泛型组件变为惰性组件,因此您不妨先为字符串编写它。这也会解决你(其他)的问题。这是一个考试的例子,所以是一个理论上的例子。但我仍然不认为编译器允许扩展字符串有任何意义。
String
是最终的;我甚至不确定编译器是否会允许您编写
T扩展字符串
。您也不能扩展整数等。它们是神圣的。但仅使用“return a;”就可以完美编译。为了清楚起见,
是毫无意义的。这本质上转化为
Str