如何自动将Object引用转换为实例类型?

时间:2010-12-02 12:23:17

标签: java types casting overloading

我正在使用像这样使用方法重载的JCR API:

setProperty(String value)
setProperty(Boolean value)
setProperty(Integer value)
...

然后我有一个Collection<Object>,其中可能包含StringBooleanInteger等实例。

我想迭代这个集合,将每个元素传递给该实例类型的正确setProperty实现。显而易见的方法是这样的:

for (Object value : values) {
   if (value instanceof String) node.setProperty((String) value);
   if (value instanceof Boolean) node.setProperty((Boolean) value);
   if (value instanceof Integer) node.setProperty((Integer) value);
   ...
}

现在除了丑陋 - 偏离OO理想之外 - 这个解决方案根本无法扩展。虽然它适用于这种特殊情况,但随着类型数量的增加,它会很快变得难以处理。

我真的觉得必须有一些优雅的技巧或工具来自动执行这个转换操作。

2 个答案:

答案 0 :(得分:3)

不,没有 - 因为你要求重载解析,通常在编译时执行,而不是在执行时执行。

选项:

  • 使用反射查找并执行方法
  • 使用visitor pattern模拟double dispatch(这可能不适合您的情况;我不像其他人那样喜欢访客模式)

答案 1 :(得分:0)

  

我真的觉得必须有一些优雅的技巧或工具来自动执行这个转换操作。

我认为你不会找到一个。

如果你有大量的替代品(即20或更多),那么在value.getClass()上进行哈希表查找可能会有意义,为你提供一个“setter”对象的实例。但是你需要写很多样板代码......所以这并不算雅,IMO。

反射也是一种选择,但价格昂贵且引入了更多潜在的运行时故障模式。此外,我实际上并没有看到它在这种特殊情况下会有多大帮助。