I wish to be able to change a subclass to a superclass then, if needed, back to its subclass to get access to all the methods and fields and modify them as required.
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);
}
}
Is this possible? Does the code need to be restructured?
In this snippet you have GenericEvent
as static type (the specification of what event
is required to have) and SpecificEvent
as dynamic type (the actual implementation):
//no cast needed, because SpecificEvent IS an GenericEvent
GenericEvent event = new SpecificEvent();
event
is a SpecificEvent
, cast to the target type: //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
above also checks for subclasses of SpecificEvent
. If you like to check explicitly that event
is a SpecificEvent
(and not possibly a subclass of SpecificEvent
!), compare the class object of the dynamic type: if(event.getClass() == SpecificEvent.class) { //safe cast SpecificEvent specEvent = (SpecificEvent) event; }
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.