exemplo de conversão de tipo explícito em java
Eu me deparei com este exemplohttp://www.javabeginner.com/learn-java/java-object-typecasting e na parte em que fala sobre vazamento de tipo explícito, há um exemplo que me confunde.
O exemplo:
class Vehicle {
String name;
Vehicle() {
name = "Vehicle";
}
}
class HeavyVehicle extends Vehicle {
HeavyVehicle() {
name = "HeavyVehicle";
}
}
class Truck extends HeavyVehicle {
Truck() {
name = "Truck";
}
}
class LightVehicle extends Vehicle {
LightVehicle() {
name = "LightVehicle";
}
}
public class InstanceOfExample {
static boolean result;
static HeavyVehicle hV = new HeavyVehicle();
static Truck T = new Truck();
static HeavyVehicle hv2 = null;
public static void main(String[] args) {
result = hV instanceof HeavyVehicle;
System.out.print("hV is an HeavyVehicle: " + result + "\n");
result = T instanceof HeavyVehicle;
System.out.print("T is an HeavyVehicle: " + result + "\n");
result = hV instanceof Truck;
System.out.print("hV is a Truck: " + result + "\n");
result = hv2 instanceof HeavyVehicle;
System.out.print("hv2 is an HeavyVehicle: " + result + "\n");
hV = T; //Sucessful Cast form child to parent
T = (Truck) hV; //Sucessful Explicit Cast form parent to child
}
}
Na última linha em que T é atribuída a referência hV e typecast como (Truck), por que ela diz no comentário que essa é uma conversão explícita bem-sucedida de pai para filho? Pelo que entendi, a conversão (implícita ou explícita) só alterará o tipo de objeto declarado, não o tipo real (que nunca deverá mudar, a menos que você realmente atribua uma nova instância de classe à referência de campo desse objeto). Se hv já foi atribuído uma instância de uma classe HeavyVehicle que é uma superclasse da classe Truck, como então esse campo pode ser convertido em uma subclasse mais específica chamada Truck que se estende da classe HeavyVehicle?
A maneira que eu entendo é que o casting serve ao propósito de limitar o acesso a certos métodos de um objeto (instância de classe). Portanto, você não pode converter um objeto como uma classe mais específica que tenha mais métodos do que a classe atribuída real do objeto. Isso significa que o objeto só pode ser lançado como uma superclasse ou a mesma classe que a classe da qual ele foi realmente instanciado. Isso está correto ou estou errado aqui? Eu ainda estou aprendendo, então não tenho certeza se essa é a maneira correta de ver as coisas.
Eu também entendo que isso deve ser um exemplo de downcasting, mas não tenho certeza de como isso realmente funciona se o tipo atual não tiver os métodos da classe para a qual este objeto está sendo reduzido. A conversão explícita de alguma forma altera o tipo real de objeto (não apenas o tipo declarado), de modo que esse objeto não seja mais uma instância da classe HeavyVehicle, mas agora se torne uma instância da classe Truck?