Por que eu posso converter um objeto? isso pode ser feito com outros objetos?

ErlichBachman:

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. Graphicse Graphics2Dsã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 ...

dfritsi:

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.

Acho que você gosta

Origin http://10.200.1.11:23101/article/api/json?id=478556&siteId=1
Recomendado
Clasificación