Java中的参数类

Java中的参数类,java,class,Java,Class,我对这段代码有点困惑,这是一个理解参数类的测试 我有两个类,一个是主类,另一个是参数类。当我用Integer作为参数创建一个新对象时,我认为构造函数将调用print(Integer x)方法,但情况并非如此,相反,java将调用print(Object o)方法 你们中有人知道为什么会这样吗 package classi.parametriche; public class Contenitore <E> { public E variabile; public Contenit

我对这段代码有点困惑,这是一个理解参数类的测试

我有两个类,一个是主类,另一个是参数类。当我用Integer作为参数创建一个新对象时,我认为构造函数将调用print(Integer x)方法,但情况并非如此,相反,java将调用print(Object o)方法

你们中有人知道为什么会这样吗

package classi.parametriche;

public class Contenitore <E> {
public E variabile;

public Contenitore(E value){
    variabile = value;
    System.out.println("Variabilie : "+variabile.getClass().toString());
    System.out.println("Variabile : "+value.getClass().toString());
    println(variabile);
}
public void println(String s){
    System.out.println("Stringa : "+ s);
}
public void println(Integer x){
    System.out.println("Int : " + x);
}
public void println(short x){
    System.out.println("short : " + x);
}
public void println(byte x){
    System.out.println("byte : " + x);
}
public void println(long x){
    System.out.println("long : " + x);
}
public void println(char x){
    System.out.println("char : " + x);
}
public void println(float x){
    System.out.println("float : " + x);
}
public void println(double x){
    System.out.println("double : " + x);
}
public void println(Object o){
    if (o != null){
        System.out.println("Object : " + o.toString());
    }else{
        System.out.println("null");
    }
}
这是因为编译时绑定

编译器在编译时决定调用哪个println方法。因为类的字段是泛型,没有定义超类,所以类型擦除后剩余的类型是Object。这意味着字段变量在内部作为对象处理


您也可以查看post以了解详细信息。

答案是键入擦除。在运行时,该类没有参数类型。Java中的泛型纯粹是编译时的糖。一旦代码被编译,它就失去了相关参数类型的任何知识。因此,当您将整数传递到构造函数中时,构造函数实际上需要一个java.lang.Object类型的变量

泛型函数的可能副本仅可用于编译。java代码编译成.class文件后,泛型特性(例如类的参数)将被删除,即在运行时,您只有Object。查看类型擦除。泛型
E
在运行时仅称为
Object
。这与类型擦除无关,因为使用的重载方法是在编译时选择的,而不是在运行时选择的。在编译时,我们只知道
E
是一个
对象
或其子类,因此将使用
对象
变量。这与类型擦除无关,因为所使用的重载方法是在编译时选择的,而不是在运行时。是的,我在5分钟前就理解了它,谢谢你的快速回答:)我很困惑,因为当我第一次控制“类的类型”时,我看到了Integer这个名称,我不认为这个方法可能属于一个对象
public class ClassiParametriche {
    public static void main(String[] args) {
        Contenitore<Integer> c = new Contenitore <Integer>(42);

    }
}
 run:
 Variabilie : class java.lang.Integer
 Variabile : class java.lang.Integer
 Object : 42