我有这段代码。为什么它不起作用?(工作时它显示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
对于整数的构造函数的int
参数,不是一个Integer
。
为了使魔术方法起作用,您需要对类型进行特殊检查,如果它是包装器类,则实际上要查找其参数为对应的原始类型的构造函数。
AFAIK没有内置的方法可以从包装器类中获取primatove类-您可以使用映射并使用映射填充它:
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
-至少可以自动取消装箱。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句