如何“动态”地将Object类型的实例强制转换为特定的数据类型?
public Object foo(int opt){
if (opt == 0) return new String();
else if (opt == 1) return new Integer(1);
else if (opt == 2) return new Double(1);
else if ...
.. and many more
}
public void doSomething(String s){..}
public void doSomething(Integer i){..}
public void doSomething(Double d){..}
... and many more doSomething method
public static void main(String[] args){
...
Object o = foo(x); //x is a value obtained during runtime, e.g. from user input
//now I want to call doSomething method
// (1)
if (o instanceof String) doSomething((String) o);
else if (o instanceof Integer) doSomething((Integer) o);
else if (o instanceof Double) doSomething((Double) o);
...
// (2)
}
有没有更好的方法来简化(1)......(2)所包含的语句?
Java Reflection有帮助吗?
没有找到相关结果
已邀请:
5 个回复
扭湘阀柿蹄
拟僚疽刊剔
调用正确的
超载而不仅仅是返回值吗?这是知道正在构造什么的代码 - 如果你可以通过适当的重载将一个对象调用
,你最终会在一个地方找到特定于类型的逻辑。 在Java 7中,invokedynamic可能在这种情况下很有用 - 当然C#4中的
类型会有所帮助 - 但是我还没有足够好地调查invokedynamic。
熊融炭臀陛
你的foo()方法实际上变成了一个工厂,从那时起你不再需要关心foo返回了什么样的东西。
谦响局豢报
警告:当以这种方式使用反射时,您需要处理以下异常:(顺便提一下,这不是一个不常见的列表,反射通常在异常方面非常嘈杂)
逝媳蘑贩茄