Java 类泛型中使用的包装类

Java 类泛型中使用的包装类,java,generics,Java,Generics,在java中,在该类的泛型中使用特定的包装类之后,我们不能在该类的任何静态方法或实例方法或实例变量中使用该特定包装类。另一个问题是,只能接受整数对象的构造函数也在接受字符串(或任何其他包装类对象)。查看下面的代码,这些编译错误背后的原因是什么? public class Exp<Integer> { Integer val1; Integer val2=new Integer(2);//compilation error, cannot instantiate th

在java中,在该类的泛型中使用特定的包装类之后,我们不能在该类的任何静态方法或实例方法或实例变量中使用该特定包装类。另一个问题是,只能接受整数对象的构造函数也在接受字符串(或任何其他包装类对象)。查看下面的代码,这些编译错误背后的原因是什么?

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**



    }
}
公共类Exp{
整数val1;
Integer val2=新整数(2);//编译错误,无法实例化Integer类型
公共Exp(整数arg1){
系统输出打印项次(arg1);
val1=arg1;
}
公共无效lol(){
//Integer intValue2=新整数(2);//编译错误,无法对非静态类型Integer进行静态引用
}
公共静态void main(字符串[]args){
Exp obj1=新Exp(10);
//Exp obj2=新Exp(“你好世界”);
//Exp obj3=new Exp(“sss”);//构造函数接受整数arg,那么为什么字符串arg可以完美地使用它呢?
字符串str=“10”;
字符c=新字符('c');//工作正常
浮球f1=3.0f;
Integer intValue1=新整数(2);//**编译错误,无法对非静态类型Integer进行静态引用**
Exp obj4=new Exp(10);//**编译错误,无法对非静态类型整数进行静态引用**
}
}
这里您没有使用“泛型中的包装类”,您只是在
java.lang
包中将您的泛型类型变量命名为一个现有类,它隐藏了原始类。但是,您仍然可以使用完全限定名访问原始类:

java.lang.Integer val2 = new java.lang.Integer(2);
对于存在编译错误的其他地方也是如此。一般来说,最好避免使用与
java.lang
类冲突的名称。也许你真的想写些不同的东西,比如

public class Exp extends SomeOtherGenericClass<Integer> { ... }
public class Exp扩展了SomeOtherGenericClass{…}
这里您没有使用“泛型中的包装类”,您只是在
java.lang
包中将您的泛型类型变量命名为一个现有类,它隐藏了原始类。但是,您仍然可以使用完全限定名访问原始类:

java.lang.Integer val2 = new java.lang.Integer(2);
对于存在编译错误的其他地方也是如此。一般来说,最好避免使用与
java.lang
类冲突的名称。也许你真的想写些不同的东西,比如

public class Exp extends SomeOtherGenericClass<Integer> { ... }
public class Exp扩展了SomeOtherGenericClass{…}

尖括号中的类型是一个虚拟类型,稍后将替换实际类型。通常使用
。您使用了一个实类型,
,它隐藏了系统类
Integer
,因此程序中的
Integer
不再引用
java.lang.Integer
,从而导致错误消息

您的代码应该如下所示:

public class Exp<T> {
    T val1;
    ...
公共类Exp{
T-val1;
...

尖括号中的类型是一个虚拟类型,稍后将其替换为实际类型。通常使用
。您使用了一个实类型,
,它隐藏了系统类
Integer
,因此程序中的
Integer
不再引用
java.lang.Integer
,从而导致错误消息盖斯

您的代码应该如下所示:

public class Exp<T> {
    T val1;
    ...
公共类Exp{
T-val1;
...

那么你的问题是什么?@AdamSkywalker无法理解编译错误背后的原因。那么你的问题是什么?@AdamSkywalker无法理解编译错误背后的原因。好吧,我使用的整数只是一个变量(不是包装类),正如@Neil所说,我可以使用任何变量,这些变量将充当稍后提供的实际类型的占位符,主要是在对象创建时,对吗?好吧,我使用的整数只是一个变量(不是包装类),正如@Neil所说,我可以使用任何变量,这些变量将充当稍后提供的实际类型的占位符,主要是在对象创建时,对吗?