2

我有一个基类class Base和两个子类

class A extends Base

class B extends Base

我有一个方法fooBase

而不是把实现foo放在class Aandclass B中,这样我就可以做到

void foo (Object o)
{
    // A's implementation
    assert o instanceof A;     
}


 void foo (Object o)
 {
     // B's implementation
     assert o instanceof B; 
 }

无论如何要放入fooBase,并且仍然可以检查运行时类吗?我想过这样的事情:

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

谢谢。

4

5 回答 5

6

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

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

但是多态的重点是把A的实现放到A里面,这样这个实现就可以使用A的私有字段来实现方法(B也一样,或者当然)。

于 2012-06-18T15:18:46.707 回答
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()); 

不会编译。

于 2012-06-18T15:17:12.703 回答
1

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

您可以使用以下isInstance方法Class

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

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

于 2012-06-18T15:22:18.070 回答
1

有类方法 isAssignableFrom()

   getClass().isAssignableFrom(o.getClass())
于 2012-06-18T15:16:26.540 回答
0

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

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

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

于 2012-06-18T15:17:52.343 回答