在Java中使用instanceof运算符

在Java中使用instanceof运算符,java,class,runtime,instanceof,Java,Class,Runtime,Instanceof,我有一个名为classbase的基类和两个子类 class A extends Base 及 我在Base中有一个方法foo 而不是将foo的实现放在class A和class B中,这样我就可以 void foo (Object o) { // A's implementation assert o instanceof A; } void foo (Object o) { // B's implementation assert o i

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

class A extends Base

我在
Base
中有一个方法
foo

而不是将
foo
的实现放在
class A
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
    }
}

谢谢。

有一个类方法isAssignableFrom()

也就是说,也许您希望以编译器可以检查的方式约束类型?泛型可以做到这一点:

class Base<T extends Base<B>> {
    void foo(T o) { ... }
}

class A extends Base<A> {
    @Override void foo(A o) { ... }
}

不会编译。

在Java中,可以使用instanceof操作符检查对象的类: M的对象实例

当您有一个类对象时,编写以下内容是有意义的: object.getClass().isAssignableTo(MyClass.class)


您可以这样实现您的方法:

 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或course相同)。

instanceof
将不起作用,因为参数不能是“动态”的

您可以使用
Class

void foo (Object o)
{
    // Check that o is instanceof a runtime class
    assert getClass().isInstance(o);
}
但这至少有一个可能的问题:

如果
a
的子类的实例,而对象只是
a
的直接实例,则会导致断言异常

你到底为什么要这样做呢?是的,使用getClass().isInstance(obj)方法是可能的,但是你为什么要这样做呢?如果foo重载对于每个子类都是特定的,那么您应该在子类中实现它。让超类知道它的子类是不好的。如果超类需要做只有子类才会知道的事情,那么请考虑使用抽象的方法声明。正如在
getClass().isAssignableFrom(o.getClass())
中一样?应该是相反的吗?是的,这是我的错误。更新
public void foo() {
    if (this instanceof A) {
        // implementation for A
    }
    else if (this instanceof B) {
        // implementation for B
    }
}
void foo (Object o)
{
    // Check that o is instanceof a runtime class
    assert getClass().isInstance(o);
}