在java中,在该类的泛型中使用特定的包装类之后,我们无法在任何静态方法或实例中使用该特定的包装类该类的方法或实例变量。另一个问题是只能接受Integer对象的构造函数也接受字符串(或任何其他包装类对象)。请看下面的代码,这些编译错误背后的原因是什么?
public class Exp<Integer> {
Integer val1;
Integer val2=new Integer(2);//compilation error, cannot instantiate the type Integer
public Exp(Integer arg1){
System.out.println(arg1);
val1=arg1;
}
public void lol(){
// Integer intValue2=new Integer(2);//compilation error, cannot make static reference to the non static type Integer
}
public static void main(String[] args){
Exp obj1=new Exp(10);
// Exp obj2=new Exp("Hello world");
// Exp<String> obj3=new Exp<String>("sss");// The constructor takes Integer arg, then why is string arg working perfectly with it?
String str="10";
Character c=new Character('c');//works perfectly
Float f1=3.0f;
Integer intValue1=new Integer(2); //**compilation error, cannot make static reference to the non static type Integer**
Exp<Integer> obj4=new Exp<>(10); //**compilation error, cannot make static reference to the non static type Integer**
}
}
答案 0 :(得分:1)
这里你没有在泛型&#34;中使用&#34;包装类,你只是将你的泛型类型变量命名为java.lang
包中隐藏原始类的现有类。但是,您仍然可以使用完全限定名称访问原始类:
java.lang.Integer val2 = new java.lang.Integer(2);
对于编译错误的其他地方也一样。一般来说,最好避免使用与java.lang
类冲突的名称。可能你真的想写一些不同的东西,比如
public class Exp extends SomeOtherGenericClass<Integer> { ... }
答案 1 :(得分:1)
尖括号中的类型是一个虚拟符号,稍后将替换为实际类型。通常使用<T>
。您使用了隐藏系统类<Integer>
的实际类型Integer
,因此程序中的Integer
不再引用java.lang.Integer
,从而导致错误消息。< / p>
您的代码应如下所示:
public class Exp<T> {
T val1;
...