[英]using instanceof operator in Java
我有一个名为class Base
的基类和两个子类
class A extends Base
和
class B extends Base
我在Base
有一个方法foo
。
而不是把foo
的实现放在class A
class B
和class B
,这样我才能做到
void foo (Object o)
{
// A's implementation
assert o instanceof A;
}
void foo (Object o)
{
// B's implementation
assert o instanceof B;
}
有没有把foo
放在Base中,仍然能够检查运行时类? 我想到过这样的事情:
void foo (Object o)
{
// Check that o is instanceof a runtime class
assert o instanceof this.getClass(); // ????
}
谢谢。
您可以像这样实现您的方法:
public void foo() {
if (this instanceof A) {
// implementation for A
}
else if (this instanceof B) {
// implementation for B
}
}
但多态性的要点是将A实现放在A中,这样该实现可以使用A的私有字段来实现该方法(对于B或者课程也是如此)。
getClass().isInstance(o)
也就是说,也许您想以编译器可以检查的方式约束类型? 泛型可以做到这一点:
class Base<T extends Base<B>> {
void foo(T o) { ... }
}
class A extends Base<A> {
@Override void foo(A o) { ... }
}
然后,
new B().foo(new A());
不会编译。
有类方法isAssignableFrom()
getClass().isAssignableFrom(o.getClass())
instanceof
不起作用,因为参数不能是“动态的”。
您可以使用Class
的isInstance
方法
void foo (Object o)
{
// Check that o is instanceof a runtime class
assert getClass().isInstance(o);
}
但这至少有一个可能的问题:
如果this
是A
的子类的实例并且该对象只是A
的直接实例,它将导致AssertionException!
在Java中,您可以使用instanceof运算符检查对象的类:object instanceof M.
当你有一个Class对象时,写入:object.getClass()。isAssignableTo(MyClass.class)是有意义的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.