![](/img/trans.png)
[英]Java generic and array types, no not what you are thinking (e.g. arrays from generic types)
[英]Casting Generic Types in Java (e.g. T value = (T) inputParam)
我有一个非常简单的问题,但似乎没有人回答过。
我需要从对象到通用类型T进行类型转换。
T值=(T)参数;
这是我的示例代码。
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”中的值仍然是字符串。
我的问题是如何实现我想要的。 我向方法getValue()发送字符串“ 12.45”的原因是因为该数据不受我控制。 外部应用程序需要使用我的通用类,并且由于某些原因,它们发送值“ 12.45”的String表示形式。 因此,我的课程可以处理整数,浮点数,双精度数或其他任何值。
关键是,强制转换实际上不能更改对象的类型。 它可以通过它已经属于的任何类型来引用对象-但它不能更改实际类型。
String
不是Double
,因此不能将String
为Double
。 您需要调用Double.valueOf()
。
您不能将 String
转换为Double
; 您必须转换值。 强制转换的意思是告诉JVM,一个已知属于一个超类型的对象实际上是一个子类型的对象,而事实并非如此。
相反,知道该值是String
并希望将其作为Double
需要使用Double.valueOf(stringVariable)。
只是粗略的,但是您可以使用(1)所需的Class,(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");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.