如何通过名称将对象强制转换为类

时间:2015-07-23 08:38:28

标签: java casting

我有一个实际上是String Long或Integer的Object。 我想将它转换为正确的类,我通过参数知道,然后比较值。 现在我正在做:

switch(type) {
case Float:
    (Float) obj ...
    ....
case Long:
    (Long) obj ...
    ...
case String:
    (String) obj ...
    ....
}

在每种情况下,除了将一些对象强制转换为所选的特定类之外,其余代码都是相同的。

我想知道是否有更好的方法,所以我尝试了以下内容:

Integer myInteger = 100;
Object myObject = myInteger;

Class c = java.lang.Integer.class;  
Integer num1 = java.lang.Integer.class.cast(myObject); // works
Integer num2 = c.cast(myObject); // doesn't compile
Integer num3 = (java.lang.Integer) myObject; // works

我得到的编译错误:

  

错误:不兼容的类型:对象无法转换为Integer

我想知道它为什么会发生,也是我的代码重复的解决方案

2 个答案:

答案 0 :(得分:5)

使用Class<Integer>,以便编译器知道您指的是哪个类

Class<Integer> c = java.lang.Integer.class;
Integer num2 = c.cast(myObject); // works now

另一方面,强烈建议不要使用这种不安全的铸件。如果您可以将逻辑更改为不需要传递Object和转换(例如泛型),那么它会更好。如果没有,我建议至少在使用instanceof进行投射之前确保对象属于该类型(如kocko's answer所示)。

答案 1 :(得分:2)

使用instanceof运算符:

if (obj instanceof Float) {
    Float cast = (Float) obj;
} else if (obj instanceof String) {
    String cast = (String) obj;
} else if ..

这将使你的代码工作,但是如果我是你,我会考虑一些重构,因为这打破了Open/Closed principle