在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);
}