Java 自定义泛型类的编译错误

Java 自定义泛型类的编译错误,java,string,generics,Java,String,Generics,我遇到了这个密码 class Test<String> { String my = "Hello!"; //--- 1 String s = new String("aaa"); //---- 2 } 代码给出了两个编译时错误: 1。向字符串添加强制转换 两个人。无法实例化字符串 为什么会这样 List <? extends String(or any random class)> = new ArrayList<Anyclass>();

我遇到了这个密码

class Test<String> {
    String my = "Hello!"; //--- 1
    String s = new String("aaa"); //---- 2
}
代码给出了两个编译时错误: 1。向字符串添加强制转换 两个人。无法实例化字符串

为什么会这样

List <? extends String(or any random class)> = new ArrayList<Anyclass>(); 
这段代码编译的原因是什么?

通过使用Test,您可以声明自己的自定义类型,它隐藏了java.lang.String的用法


为泛型类定义泛型类型参数时,不要使用现有的类名,例如String

如果使用更传统的参数名T,则得到的错误将更清楚:

T my = "Hello!"; // doesn't compile since T can be anything, not necessarily a String
T s = new T("aaa"); // doesn't compile since Java does not allow you to call a constructor of 
                    // a generic type parameter (new T() wouldn't work either), and you don't
                    // even know whether the class used as the actual parameter when you instantiate
                    // your generic class would even have a constructor that accepts a String 

您正在声明一个名为String的泛型类型参数,它不同于对内置String类的常规引用。因此my和s的类型是您的类型参数,而不是内置字符串,因此它们不兼容

从测试类中删除字符串泛型类型参数;没用

class Test {
这一行不编译,因为Anyclass不扩展String,也不能;字符串是最终的

您的泛型类型类测试不表示java.lang.String。这里发生的是将泛型类型的名称设置为字符串,而不是其值

换句话说,您的代码可以重写为

class Test<T> {
    T my = "Hello!"; //--- 1
    T s = new T("aaa"); //---- 2
}
在这里,您并不是在决定泛型类型应该如何命名,而是它应该表示什么值。在本例中,String是泛型的名称,隐藏java.lang.String类。我建议您使用完全不同的通用名称。
List <? extends String> x = new ArrayList<Anyclass>();
class Test<T> {
    T my = "Hello!"; //--- 1
    T s = new T("aaa"); //---- 2
}
List <? extends String(or any random class)> = new ArrayList<Anyclass>();