为什么这会导致编译错误,尽管T扩展了String
/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
Vehicle car = new Vehicle<String>();
System.out.println(car.getLicensePlate());
}
}
class Vehicle<T extends String> {
public T getLicensePlate() {
String y="AB1234";
return y;
}
}
结果:
Main.java:22:错误:不兼容的类型:字符串无法转换为 Ť 回归y; 其中T是一个类型变量: T扩展在类车辆1错误
中声明的字符串
答案 0 :(得分:4)
首先,String
是最后一堂课,所以T extends String
毫无意义。
其次,即使您在泛型类型绑定中使用了非final类而不是String
,也无法从具有可能扩展X的返回类型的方法返回类X的实例。
例如,如果您将班级更改为:
class Vehicle<T extends Animal>
以下内容无效:
public T getAnimal() {
return new Animal();
}
因为T
可能是Animal
的子类,所以如果你用以下代码实例化你的类:
Vehicle<Cat> v = new Vehicle<>();
对v.getAnimal()
的调用必须返回Cat
个实例,而不是Animal
个实例。
答案 1 :(得分:-1)
Class Vehicle采用Type T的泛型。你不需要将T扩展为String.getLicensePlate()应该只返回类型T.(你必须确保y与T兼容)
这应该有效:
class Vehicle<T> {
public T getLicensePlate() {
String y="AB1234";
return (T) y;
}
}