Então, eu estava escrevendo um paintComponent(Graphics g)
método e percebi no início que eu estou lançando-a Graphics2D g2 = (Graphics2D) g;
. Eu escrevi este código um tempo atrás e só percebi que eu não tenho idéia o que é isso. Eu pesquisei um pouco, mas fundição objeto é um pouco estranho para mim.
Um objecto de referência pode ser estereotipado em outra referência objecto. Isso é chamado de vazamento objeto.
^^ palavra por palavra do meu livro por Y. Daniel Liang
Eu não entendo por que isso funciona. Graphics
e Graphics2D
são dois objetos diferentes como eles poderiam herdar variáveis e métodos de instância de cada-outro? Obviamente, eu estou ciente de fundição primitiva ou seja, alargando e estreitando. Isso faz sentido, uma vez que são classes de mensagens publicitárias apenas de Integer, Double, Byte etc ...
Com lançando nenhuma conversão objeto ou transformação de qualquer tipo está acontecendo. Basta imaginar que você tem a seguinte estrutura de classe:
class Mammal { }
class Human extends Mammal { }
class Dog extends Mammal { }
Agora, quando você cria uma nova instância do humano com Human human = new Human();
que também vai ser um mamífero, certo? Então, você poderia escrever um método como:
public void doSoemthing(Mammal mammal) {
if (mammal instanceof Human) {
Human human = (Human) mammal;
human.doWork();
} else if (mammal instanceof Dog) {
Dog dog = (Dog) mammal;
dog.bark();
}
}
e invocar o método como:
doSomething(new Human());
Portanto, o seu método pode levar qualquer tipo de mamífero como um parâmetro de entrada e em seu método você pode verificar que tipo de mamífero que realmente é. Então, quando você passar uma new Human()
como a entrada, tipo real do objeto será Humano. A razão porque você pode passar por um humano a um método esperando um mamífero é porque herança. Então, o que o seu método vai saber é que o parâmetro de entrada é definitivamente um mamífero. Mas pode ser qualquer tipo de mamífero. Se você quer saber que tipo real do objeto é que você pode usar instanceof
, por exemplo. E nesta linha:
Human human = (Human) mammal;
não significa que você está convertendo o parâmetro de entrada mamífero. Significa apenas que a partir de agora você quer usar o parâmetro de entrada como um humano. E você pode fazer isso, porque com o isntanceof você verificar que ele é realmente um ser humano. Você também pode fazer algo como isto:
public void doExample2(Object input) {
if (input instanceof Integer) {
System.out.println("I am a number");
} else if (input instanceof Graphics) {
System.out.println("I am a Graphics");
}
}
Observe o tipo de teh parâmetro de entrada. Objeto é a classe base de tudo.
Então, voltando ao seu cenário. Você faz isso casting, porque a partir do contexto de sua aplicação o parâmetro de entrada será sempre um Graphics2D, e é por isso que você pode fazer isso casting, e também para usar os métodos fornecidos pelo Graphics2D.