因此,假设我有两个几乎相同的类,但它们代表具有关键差异的对象。目前,这些差异并未真正实施。
例如,一个类,我们称之为MorningShiftWorker
,具有完全相同的方法和相同的构造函数,我们称之为EveningShiftWorker
。这两个对象都存储在其超类型ShiftWorker
的列表中。
从逻辑上讲,将这两个组分开是有意义的,但不是在混合中添加其他变量,我想我只是使用ShiftWorker
检查instanceof
列表中的对象。
我的问题是:instanceof
是否足够聪明,可以将苹果与橙子区分开来?这两个类目前在名称上相同。这对于instanceof
是否足以让他们分开,或者我还有其他方式可以解决这个问题吗?
答案 0 :(得分:3)
instanceof
运算符不会比较类的内容。它非常清楚x
是否为y
的实例,即使x
和y
是除了名称之外的相同类。
它只检查第一个参数是否在第二个参数的继承层次结构中,即一切都是instanceof Object
,Integer
,Float
,其朋友是instanceof Number
和当然x instanceof y
适用于x
类型的所有对象y
。
答案 1 :(得分:3)
是的,instanceof
基本上检查对象是否可以正确地转换为给定的类。假设我们有这些类:
public class Fruit {}
public class Orange extends Fruit {}
public class Apple extends Fruit {}
然后在某种方法中我们尝试:
Fruit f = new Apple();
boolean isOrange = f instanceof Orange; //False
这也适用于空/非功能接口。
答案 2 :(得分:2)
你问的是错误的问题。你应该问:“我该如何修复破碎的设计”。
如果您必须使用“几乎”相同的类,但在其方法和构造函数中共享“重复”代码;然后你正在做一些错误的。
从不重复代码。
所以,而不是担心instanceof;您应该退后一步并重新设计您的类层次结构,以找到最终如何最终实现常见事物的常见实现;所以你的早晚变换器只包含“那些不同的方面”。
您可能想查看Robert Martin的“敏捷原则”。那本书包含了一个关于“支付系统”的真实世界的例子;并详细解释了如何创建一个系统,在这个系统中,您拥有以非常不同的模式付费的员工 - 而不会在所有地方重复使用。 (您甚至可以在互联网上免费找到PDF格式的“C#”版本)。
答案 3 :(得分:0)
是的,实例是"智能"因为java使用name来区分对象/类而不是结构