Reputation: 1622
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?
Upvotes: 0
Views: 56
Reputation: 3058
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;
}
Upvotes: 1