当一个对象作为类型超类传入时,有没有办法检索子类的类型?

Jea*_*ean 3 java oop

如果我有方法签名

public void myMethod(SuperClass s){
}
Run Code Online (Sandbox Code Playgroud)

并且SuperClass有三个子类,有什么方法myMethod可以获得传入的子类的类名?

不确定它是否重要,但SuperClass是抽象的.

aio*_*obe 9

myMethod中是否有任何方法可以获取传入的子类的类名?

是的,通过使用getClass方法:

public void myMethod(SuperClass s){
    System.out.println(s.getClass());
}
Run Code Online (Sandbox Code Playgroud)

备注1:

然而,这听起来像是Bad Design™.

无论你想做什么,都要myMethod考虑为它SuperClass提供一个方法(提供一个有意义的默认实现,或者使它抽象以强制子类来实现该方法)并s在你的方法中调用这个方法:

public void myMethod(SuperClass s){
    s.abstractMethod();
}
Run Code Online (Sandbox Code Playgroud)

备注2:

如果myMethods逻辑似乎与目的无关,SuperClass并且您不希望将myMethod代码放在此类中,请考虑实现访问者模式.

  • 添加`public boolean isTerminator(){return false; 在`SuperClass`中`并覆盖它以在终结类中返回`true`,然后在`myMethod`中执行`if(s.isTerminator())`. (4认同)