如何将对象转为原始类型?Literal类布尔原始类型转型异常求解
问题解决方法
一、修改Literal类,直接支持原始类型返回
原代码抛出ClassCastException的原因是:Boolean.TYPE(原始类型boolean的Class对象)的cast()方法无法将java.lang.Boolean包装类对象转换为原始类型值。要解决这个问题,只需针对原始类型做特殊处理,直接返回包装类对象(调用方会自动拆箱):
public class Literal { private final String value; public Literal(String value) { this.value = value; } public <T> T getValue(Class<T> type) { if (type == Boolean.class || type == Boolean.TYPE) { Boolean result = Boolean.valueOf(value); // 原始类型直接返回包装类,Java会自动拆箱匹配 if (type.isPrimitive()) { return (T) result; } return type.cast(result); } throw new UnsupportedOperationException(); } }
修改后,调用new Literal("true").getValue(Boolean.TYPE)会自动将返回的Boolean对象拆箱为boolean,不会抛出异常。
二、实现原始类型转包装类型的工具方法
如果不想修改原有Literal类,可以编写一个工具方法,将原始类型的Class转换为对应的包装类Class:
public static <T> Class<T> toObjectType(Class<?> primitiveType) { if (!primitiveType.isPrimitive()) { return (Class<T>) primitiveType; } // 映射所有原始类型到对应包装类 switch (primitiveType.getName()) { case "boolean": return (Class<T>) Boolean.class; case "int": return (Class<T>) Integer.class; case "long": return (Class<T>) Long.class; case "double": return (Class<T>) Double.class; case "float": return (Class<T>) Float.class; case "short": return (Class<T>) Short.class; case "byte": return (Class<T>) Byte.class; case "char": return (Class<T>) Character.class; default: throw new IllegalArgumentException("Unsupported primitive type: " + primitiveType); } }
使用方式完全符合你的需求:
new Literal("true").getValue(toObjectType(Boolean.TYPE));
此方法会将Boolean.TYPE转换为Boolean.class,原Literal类就能正常返回包装类对象,后续可自动拆箱为原始类型。
内容的提问来源于stack exchange,提问作者Denis
相关产品推荐
相关产品推荐

