我有这个代码。为什么它不起作用?(工作时它显示3)如何解决?

public class Main {
    public static<V> V copy(V var){
        try{
            return (V) var.getClass().getConstructor(var.getClass()).newInstance(var);
        }
        catch(Exception e){
            System.out.println("Copy faield " + e.getMessage() + " ");
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {
        Integer a = new Integer(3);
        Integer b = copy(a);

        System.out.println(a);
        System.out.println(b);


    }
}

这是输出:
 Copy faield java.lang.Integer.<init>(java.lang.Integer)
    java.lang.NoSuchMethodException: java.lang.Integer.<init>(java.lang.Integer)
        at java.lang.Class.getConstructor0(Class.java:2818)
        at java.lang.Class.getConstructor(Class.java:1723)
        at Main.copy(Main.java:7)
        at Main.main(Main.java:19)
    3
    null

谢谢!

最佳答案

这里的问题是两者之间的区别:

Integer.class
int.class

Integer的构造函数采用int参数,而不是Integer

为了使魔术方法生效,您需要对类型进行特殊检查,如果它是包装器类,则实际上要寻找其参数为对应的原始类型的构造函数。

AFAIK没有从包装器类获取primatove类的内置方法-您可以使用 map 并使用映射填充它:
private static final Map<Class<?>, Class<?>> MAP = new HashMap<>() {{
    put(Integer.class, int.class);
    put(Long.class, long.class);
    // etc
}};

然后在您的方法中:
Class<?> type = MAP.containsKey(var.getClass()) ? MAP.get(var.getClass()) : var.getClass();
return (V) var.getClass().getConstructor(type).newInstance(var);

可以将int作为Integer传递到参数值中-至少可以自动取消装箱。

09-30 18:00
查看更多