我确实在 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)
添加额外的重载,您可以为 Date
、Calendar
和字符串
:
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/