Вы не можете лингвистически привести String
(ссылочный тип) к int
или double
(примитивный числовой тип). Вы должны конвертировать их. К счастью, есть стандартные способы сделать их для вас:
API ссылки
Примечание
T Class<T>.cast(Object)
делает что-то совершенно другое. Это имеет отношение к дженерикам, рефлексии, тип-токенам и т. Д.
Тем не менее, я заметил, что вы использовали необработанный тип Map
. Поскольку это выглядит как новый код, следует сказать, что вы НЕ должны использовать необработанные типы в новом коде. Вполне возможно, что вам никогда не понадобится конвертировать из String
в int
/ double
в первую очередь (или, по крайней мере, сделать это ДО , когда вы поместите их в карту).
A Map<String,Number>
(или, возможно, Map<String,Double>
) будет лучше, потому что карта является "безопасной для типов"; вы знаете, что он сопоставляет String
с Number
, и компилятор гарантирует, что вы ничего не делаете для нарушения этого инварианта типа.
Смежные вопросы
Судя по комментариям ОП, выглядит примерно так:
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"
}
}
Приведенный выше фрагмент использует токены типа и отражения для вызова метода static valueOf(String)
. Однако использование отражения может быть неоправданным в этом случае, и может быть просто лучше просто явно проверить, что представляет собой желаемое преобразование, например, "java.lang.Integer"
, а затем вызвать Integer.valueOf
соответственно.