【问题标题】:Convert between any two primitive types in JavaJava中任意两种基本类型之间的转换
【发布时间】:2013-05-12 20:55:27
【问题描述】:

在Java中,是否有可能实现一个将对象作为输入的函数,然后将对象转换为指定为参数的类型?

我正在尝试为原始数据类型实现一个通用的类型转换函数,但我不知道从哪里开始:

public static Object convertPrimitiveTypes(Object objectToConvert, String typeToConvertTo){
    //Given an object that is a member of a primitive type, convert the object to TypeToConvertTo, and return the converted object
}

例如,convertPrimitiveTypes(true, "String") 将返回字符串 "true"convertPrimitiveTypes("10", "int") 将返回整数 10。如果转换没有明确定义(例如,将布尔值转换为整数),则方法需要抛出异常,并终止程序。

【问题讨论】:

  • (many) switch + (many) instanceof?
  • 您的方法接受Object 并返回Object。不涉及原语。
  • 您没有指定要转换的输入类型。
  • @Brandon 该方法没有指定要转换的类型。它指定要转换的对象,以及要转换的对象的类型。
  • Object 我假设您的意思是将原始类型的包装类发送到函数?

标签: java types


【解决方案1】:

我写成这样

public static <T> T convertTo(Object o, Class<T> tClass) {

如果乏味也可以。如果您不关心效率,您可以转换为 String 并通过反射使用 "Class".valueOf(String)。

public static void main(String... ignore) {
    int i = convertTo("10", int.class);
    String s = convertTo(true, String.class);
    BigDecimal bd = convertTo(1.2345, BigDecimal.class);
    System.out.println("i=" + i + ", s=" + s + ", bd=" + bd);
}

private static final Map<Class, Class> WRAPPER_MAP = new LinkedHashMap<Class, Class>();

static {
    WRAPPER_MAP.put(boolean.class, Boolean.class);
    WRAPPER_MAP.put(byte.class, Byte.class);
    WRAPPER_MAP.put(char.class, Character.class);
    WRAPPER_MAP.put(short.class, Short.class);
    WRAPPER_MAP.put(int.class, Integer.class);
    WRAPPER_MAP.put(float.class, Float.class);
    WRAPPER_MAP.put(long.class, Long.class);
    WRAPPER_MAP.put(double.class, Double.class);
}

public static <T> T convertTo(Object o, Class<T> tClass) {
    if (o == null) return null;
    String str = o.toString();
    if (tClass == String.class) return (T) str;
    Class wClass = WRAPPER_MAP.get(tClass);
    if (wClass == null) wClass = tClass;
    try {
        try {
            return (T) wClass.getMethod("valueOf", String.class).invoke(null, str);
        } catch (NoSuchMethodException e) {
            return (T) wClass.getConstructor(String.class).newInstance(str);
        }
    } catch (Exception e) {
        throw new AssertionError(e);
    }
}

打印

i=10, s=true, bd=1.2345

【讨论】:

  • OP 询问 primitives 这可能意味着他不想使用包装器。
  • @PM77-1 op 的方法接受一个 Object 并返回一个 Object - 里面没有原语。
  • 好吧,有了自动装箱,他有这个选择吗?问问为什么要寻找原语是个好主意:)
  • @assylias 作为输入,该方法应该能够接受任何类型的原语,并且应该能够返回任何类型的原语。
  • @JamesPoulson 你应该试一试void.classVoid.class ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多