我有一个方法,根据给定的类型对String进行强制转换,假设给定的String必须正确。
private static <T> T parsePrimitive(final Class<T> primitiveType, final String primitiveValue) {
if (primitiveType.equals(int.class) || primitiveType.equals(Integer.class)) {
return primitiveType.cast(Integer.parseInt(primitiveValue));
}
/*
...
for the rest of the primitive type
...
*/
}
但是,当我致电parsePrimitive(int.class, "10");
时,
primitiveType.cast(的Integer.parseInt(primitiveValue));
这导致ClassCastException
,对此有任何想法吗?
P.S。实际上,当我使用Object作为返回类型,并且在返回之前没有强制转换时,它在方法之外工作正常,但我认为这不够通用。
提前感谢您的帮助。
答案 0 :(得分:3)
你正在混合自动装箱和铸造。 java编译器将生成字节码到框并将基元拆箱到对象,反之亦然,但这同样不适用于类型。
在您的特定情况下,int.class和Integer.class不能彼此分配。
Class<?> intClazz = int.class;
Class<?> integerClazz = Integer.class;
System.out.println(intClazz);
System.out.println(integerClazz);
System.out.println(integerClazz.isAssignableFrom(intClazz));
输出:
int
class java.lang.Integer
false
由于你需要在逻辑中加入专门检查的数量,我不确定是否值得尝试提出一种将String解析为原始值的通用方法。
答案 1 :(得分:0)
int.class
是一个VM内部类,与Integer.class
不同。这是一小段代码,用于显示int.class和Integer.class之间的区别。
import java.lang.reflect.Modifier;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
dump(int.class);
System.out.println("---");
dump(Integer.class);
}
private static void dump(Class<?> c) {
System.out.printf(
"Name: %s%n" +
"Superclass: %s%n" +
"Interfaces: %s%n" +
"Modifiers: %s%n",
c.getName(),
c.getSuperclass() == null ? "null" : c.getSuperclass().getName(),
Arrays.asList(c.getInterfaces()),
Modifier.toString(c.getModifiers()));
}
}
输出:
Name: int
Superclass: null
Interfaces: []
Modifiers: public abstract final
---
Name: java.lang.Integer
Superclass: java.lang.Number
Interfaces: [interface java.lang.Comparable]
Modifiers: public final