来回转换超类和子类

扫视

我希望能够将子类更改为超类,然后在需要时返回其子类,以访问所有方法和字段并根据需要对其进行修改。

public class MainClass {
    public static main(String[] args) {
        SpecificEvent completeEvent = new SpecificEvent();
        GenericEvent event = completeEvent;
        event.fire();
        // without creating a new SpecificEvent how can i change str, without using the completeEvent reference, so that event.fire() has a different result?
    }
}

public abstract class GenericEvent {
    public abstract void fire();
}

public class SpecificEvent extends GenericEvent {
    public String str = "fired";
    @Override
    public void fire() {
        System.out.println(str);
    }
}

这可能吗?是否需要重组代码?

宾坎薪水人

在此代码段中,您可以GenericEvent使用静态类型(所需的规范event)和SpecificEvent动态类型(实际实现):

//no cast needed, because SpecificEvent IS an GenericEvent
GenericEvent event = new SpecificEvent();

  • 如果您假设eventSpecificEvent,则将其强制转换为目标类型:

    //unsafe cast, exception is thrown if event is not a SpecificEvent
    SpecificEvent specEvent = (SpecificEvent) event; 
    

  • 在大多数情况下,您将首先检查动态类型:

    if(event instanceof SpecificEvent) {
        //safe cast
        SpecificEvent specEvent = (SpecificEvent) event;
    }
    

  • instanceof上述的组合也检查的子类SpecificEvent如果你想明确地确认event是一个SpecificEvent(而不是可能是子类SpecificEvent!),比较动态类型的类对象:

    if(event.getClass() == SpecificEvent.class) {
        //safe cast
        SpecificEvent specEvent = (SpecificEvent) event;
    }
    
  • 本文收集自互联网,转载请注明来源。

    如有侵权,请联系 [email protected] 删除。

    编辑于
    0

    我来说两句

    0 条评论
    登录 后参与评论

    相关文章