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>();