¿Por qué puedo convertir un objeto? ¿Se puede hacer con otros objetos?

ErlichBachman:

Así que estaba escribiendo un paintComponent(Graphics g)método y me di cuenta al principio que yo echo a Graphics2D g2 = (Graphics2D) g;. Escribí este código hace un tiempo y apenas se dio cuenta de que no tengo ni idea de qué se trata. Busqué en Google un poco, pero objeto de fundición es un poco extraño para mí.

Una referencia de objeto puede ser encasillado en otra referencia de objeto. Esto se llama el objeto de colado.

^^ palabra por palabra de mi libro de texto de Daniel Y. Liang

No entiendo por qué esto funciona. Graphicsy Graphics2Dson dos objetos diferentes, ¿cómo podrían heredar variables y métodos de instancia de cada-otro? Obviamente, yo soy consciente de fundición primitiva es decir, ensanchamiento y estrechamiento. Esto tiene sentido ya que son simplemente clases contenedoras de Integer, Double, Byte, etc ...

dfritsi:

Con fundición ninguna conversión objeto o transformación de cualquier tipo que está sucediendo. Imagínese que usted tiene la siguiente estructura de clases:

class Mammal { }
class Human extends Mammal { }
class Dog extends Mammal { }

Ahora cuando se crea una nueva instancia de humano con Human human = new Human();que también ser un mamífero, ¿verdad? Así se podría escribir un 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 el método como:

doSomething(new Human());

Por lo que su método puede tomar cualquier tipo de mamífero como parámetro de entrada y en su método se puede comprobar qué clase de los Mamíferos lo que realmente es. Así que cuando se pasa una new Human()como la entrada, el tipo real del objeto será humano. La razón porque se puede pasar a un ser humano a un método esperando un mamífero se debe a la herencia. Así que lo que su método va a saber es que el parámetro de entrada es sin duda un mamífero. Pero puede ser cualquier clase de los Mamíferos. Si desea saber qué tipo real del objeto se puede utilizar instanceofpor ejemplo. Y en esta línea:

Human human = (Human) mammal;

no quiere decir que va a convertir el parámetro de entrada mamífero. Sólo significa que de ahora en adelante que desea utilizar el parámetro de entrada como un humano. Y se puede hacer eso, porque con la isntanceof comprobar que es realmente un ser humano. También podría hacer algo como esto:

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 el tipo de teh parámetro de entrada. Objeto es la clase base de todo.

Así que volviendo a su escenario. Usted lo hace de fundición, porque desde el contexto de su aplicación el parámetro de entrada será siempre un Graphics2D, y es por eso que puede hacer que la fundición, y también para utilizar los métodos proporcionados por Graphics2D.

Supongo que te gusta

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