繁体   English   中英

在Java中使用instanceof运算符

[英]using instanceof operator in Java

我有一个名为class Base的基类和两个子类

class A extends Base

class B extends Base

我在Base有一个方法foo

而不是把foo的实现放在class A class Bclass 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不起作用,因为参数不能是“动态的”。

您可以使用ClassisInstance方法

void foo (Object o)
{
    // Check that o is instanceof a runtime class
    assert getClass().isInstance(o);
}

但这至少有一个可能的问题:
如果thisA的子类的实例并且该对象只是A的直接实例,它将导致AssertionException!

在Java中,您可以使用instanceof运算符检查对象的类:object instanceof M.

当你有一个Class对象时,写入:object.getClass()。isAssignableTo(MyClass.class)是有意义的。

http://www.ralfebert.de/blog/java/isassignablefrom/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM