我有一个非常简单的问题,但似乎没有人回答过它。
我需要从对象转换为泛型类型T. 这样的事情。
T值=(T)param;
这是我的示例代码。
public class App {
public static void main(String[] args) {
MyGeneric<Double> myGeneric = new MyGeneric();
Object obj = myGeneric.getValue("12.45");
}
}
public class MyGeneric<T> {
public T getValue(Object value) {
return (T) value;
}
}
我有一个类的泛型类,以及一个接收Object作为参数并返回相同对象的方法。
我希望我的班级自动从“12.45”投射到双倍值12.45。但是,我的班级什么也没做。最后,变量“obj”中的值仍然是String。
我的问题是如何实现我想要的。我将字符串“12.45”发送到我的方法getValue()的原因是因为该数据不是由我控制的。外部应用程序需要使用我的泛型类,并且由于某种原因,它们发送值为“12.45”的字符串表示形式。所以我的班级可以处理整数,浮点数,双精度或任何东西。
答案 0 :(得分:5)
String
不是Double
,因此您无法将String
投射到Double
。您需要致电Double.valueOf()
。
答案 1 :(得分:4)
你不能施放 String
到Double
;你必须转换价值。转换意味着告诉JVM一个已知属于一个超类型的对象实际上是一个子类型的对象,而这不是这里的情况。
相反,知道该值的代码是String
,并希望它是Double
需要使用`Double.valueOf(stringVariable)。
答案 2 :(得分:0)
只是粗略,但你可以使用(1)所需的类,(2)反射
public static <T> T getValue(Class<T> klazz, Object value) {
try {
// Try whether value has correct type:
return klazz.cast(value);
} catch (ClassCastException e) {
// Try whether klazz has static .valueOf(String)
// Then value not null:
String s = value.toString();
Method valueOf = klazz.getDeclaredMethod("valueOf", String.class);
int modifiers = valueOf.getModifiers();
if (Modifiers.isStatic(modifiers)) {
valueOf.setAccessible(true);
return valueOf.invoke(null, s);
}
}
throw new IllegalArgumentException(value);
}
double x = getValue(Double.class, "12.34");