我有一个名为class Base
的基类和两个子类
class A extends Base
和
class B extends Base
我在foo
中有一个方法Base
。
而不是将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(); // ????
}
感谢。
答案 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);
}
但这至少有一个可能的问题:
如果this
是A
的子类的实例并且该对象只是A
的直接实例,则会导致AssertionException!
答案 4 :(得分:0)
在Java中,您可以使用instanceof运算符检查对象的类: 对象实例M
当你有一个Class对象时,写下来是有意义的: object.getClass()。isAssignableTo(MyClass.class)