您不能在语言上将 String(引用类型)转换为 int 或 double(原始数字类型)。你必须转换它们。值得庆幸的是,有一些标准方法可以为您完成:
API 链接
注意
T Class<T>.cast(Object) 做了完全不同的事情。它与泛型、反射、类型标记等有关。
也就是说,我注意到您使用了原始的 Map 类型。由于这看起来像一个新代码,应该说您不应该在新代码中使用原始类型。您可能一开始就不需要从 String 转换为 int/double(或者至少在在将它们放入地图之前这样做)。
Map<String,Number>(或者Map<String,Double>)会更好,因为地图是“类型安全的”;你知道它将String 映射到Number,编译器会确保你没有做任何违反这种类型不变量的事情。
相关问题
根据 OP 的 cmets,看起来需要这样的东西:
import java.util.*;
public class MapTranslate {
static Object interpret(String s) {
Scanner sc = new Scanner(s);
return
sc.hasNextInt() ? sc.nextInt() :
sc.hasNextLong() ? sc.nextLong() :
sc.hasNextDouble() ? sc.nextDouble() :
sc.hasNext() ? sc.next() :
s;
}
public static void main(String[] args) {
Map<String,String> map1 = new HashMap<String,String>();
map1.put("One", "1");
map1.put("PI", "3.141592653589793");
map1.put("10^12", "1000000000000");
map1.put("Infinity", "oo");
map1.put("Blank", " ");
Map<String,Object> map2 = new HashMap<String,Object>();
for (Map.Entry<String,String> entry : map1.entrySet()) {
map2.put(entry.getKey(), interpret(entry.getValue()));
}
for (Map.Entry<String,Object> entry: map2.entrySet()) {
System.out.format("%s->[%s] (%s)%n",
entry.getKey(),
entry.getValue(),
entry.getValue().getClass().getSimpleName()
);
}
}
}
这会产生:
PI->[3.141592653589793] (Double)
Infinity->[oo] (String)
One->[1] (Integer)
10^12->[1000000000000] (Long)
Blank->[ ] (String)
这不是最强大的(例如,它不处理 null 键/值),但它可能是一个很好的起点。请注意,它使用java.util.Scanner 及其hasXXX 方法;这样您就不必担心任何NumberFormatException。
但是,如果不了解大局,就很难评论这样的事情是否是一个好主意。
相关问题
使用反射
这似乎也是问题的一个方面;以下内容应具有指导意义:
import java.lang.reflect.*;
public class ValueOfString {
static <T> T valueOf(Class<T> klazz, String arg) {
Exception cause = null;
T ret = null;
try {
ret = klazz.cast(
klazz.getDeclaredMethod("valueOf", String.class)
.invoke(null, arg)
);
} catch (NoSuchMethodException e) {
cause = e;
} catch (IllegalAccessException e) {
cause = e;
} catch (InvocationTargetException e) {
cause = e;
}
if (cause == null) {
return ret;
} else {
throw new IllegalArgumentException(cause);
}
}
public static void main(String[] args) throws ClassNotFoundException {
Integer ii = valueOf(Integer.class, "42"); // no need to cast!
System.out.println(ii); // prints "42"
Object o = valueOf(Class.forName("java.lang.Double"), "3.14159");
System.out.println(o);
System.out.println(o instanceof Double); // prints "true"
}
}
上面的 sn-p 使用类型标记和反射来调用static valueOf(String) 方法。然而,在这种情况下,使用反射可能是不合理的,最好只明确检查所需的转换是什么,例如"java.lang.Integer",然后相应地调用Integer.valueOf。