字符串无法转换为T.

时间:2018-01-05 08:25:57

标签: java generics

为什么这会导致编译错误,尽管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错误

中声明的字符串

2 个答案:

答案 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;
    }
}