在处理java.lang.Object的实例时避免使用instanceof

Age*_*opf 1 java object instanceof

我确实在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*ter 5

你的主要限制是:

我无法更改方法签名

有了这个约束,我认为没有办法解决这个问题instanceof.你在方法中所拥有的只是一个Object.

如果你至少可以为其添加额外的重载setValue(Object newValue),你可以添加必要的重载Date,Calendar并且String:

public void setValue(Date newValue) {}
public void setValue(Calendar newValue) {}
public void setValue(String newValue) {}
Run Code Online (Sandbox Code Playgroud)

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