在Java中使用instanceof运算符

时间:2012-06-18 15:11:23

标签: java class runtime instanceof

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

class A extends Base

class B extends Base

我在foo中有一个方法Base

而不是将foo的实施放在class Aclass 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(); // ????
 }

感谢。

5 个答案:

答案 0 :(得分:4)

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

public void foo() {
    if (this instanceof A) {
        // implementation for A
    }
    else if (this instanceof B) {
        // implementation for B
    }
}

但多态性的要点是将A实现放在A中,这样这个实现就可以使用A的私有字段来实现该方法(对于B或者当然也是如此)。

答案 1 :(得分:2)

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()); 

不会编译。

答案 2 :(得分:1)

有类方法isAssignableFrom()

   getClass().isAssignableFrom(o.getClass())

答案 3 :(得分:1)

instanceof无效,因为参数不能为“动态”。

您可以使用isInstance

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

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

答案 4 :(得分:0)

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

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

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