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

标签 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);
    }
}

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

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

最佳答案

您的主要限制是:

I can't change the method signature

有了这个约束,我认为没有办法绕过 instanceof 用法。您的方法中只有一个 Object

如果您至少可以为 setValue(Object newValue) 添加额外的重载,您可以为 DateCalendar字符串:

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

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

关于java - 在处理 java.lang.Object 的实例时避免使用 instanceof,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16582570/

相关文章:

java - 即使我安装了 java 1.7,Maven 也会出现 java 版本错误(要求 java 1.5)

java - sun.net.www.protocol.https.HttpsURLConnectionImpl 无法转换为 sun.net.www.protocol.http.HttpURLConnection

c++ - "lost"堆栈对象发生了什么?

java - instanceof 运算符不适用于 Class 类型变量

java - 字节码查看器还是反编译器最适合理解 JVM 语言代码

java - Java 正则表达式的另一种模式

javascript - 将数组元素设置为对象属性

java - 在 Java 中为多种对象类型创建方法

JSF EL : instanceof reserved but not yet implemented?

java - 如何替换 "instanceof"函数中的变量