2

我确实在 ym 代码中有一些 instanceof 检查,但有些我希望可以避免。通常只要有多个 if 语句,例如:

public void setValue(Object newValue) {
    //dateTime is a member variable of the type java.util.Date
    if (newValue instanceof Date) {
      dateTime = new DateTime((Date) newValue);

    } else if (newValue instanceof Calendar) {
      dateTime = MyDateTimeUtils.toDate((Calendar)newValue);

    } else if (newValue instanceof String) {
      dateTime = MyDateTimeUtils.toDate((String)newValue);
    }
}

MyDateTimeUtils 只是一个实用程序类,用于转换日期/时间类型(日历到日期、日期到日历、字符串到日期等)。

我的主要问题是,newValue 属于实例对象(我无法更改方法签名,因为它是处理数据绑定的框架的一部分)。如果它是有形的,我想它会更简单,我可以让该类实现一个接口,该接口提供到 Date 的转换方法。但由于它是 Object 类型,我不确定如何绕过这些 instanceof 检查?

4

1 回答 1

6

您的主要限制是:

我无法更改方法签名

有了这个限制,我认为没有办法绕过instanceof使用。您在方法中所拥有的只是一个Object.

如果您至少可以为 添加额外的重载,setValue(Object newValue)则可以为和添加必要的重载:DateCalendarString

public void setValue(Date newValue) {}
public void setValue(Calendar newValue) {}
public void setValue(String newValue) {}

然后编译器将在编译时通过其签名选择正确的方法。Java不支持多次dispatch (在运行时根据参数类型决定调用哪个方法),所以不可能让setValue(Object newValue)自动dispatch回匹配的重载。

于 2013-05-16T08:44:13.263 回答