我有一个实际上是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
我想知道它为什么会发生,也是我的代码重复的解决方案
答案 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