tontos practicar poo para introduccion estudiantes ejercicios desde codigos cero java casting object

practicar - java para tontos



Reglas de Java para el casting (6)

¿Cuándo puede un cierto objeto ser lanzado a otro objeto? ¿El objeto fundido tiene que ser un subtipo del otro objeto? Estoy tratando de averiguar las reglas ...

Edición : Me di cuenta de que no expliqué mi problema en absoluto: básicamente estoy lanzando un objeto a un tipo de interfaz. Sin embargo, en tiempo de ejecución, obtengo una java.lang.ClassCastException . ¿Qué debe pasar con mi objeto para que pueda enviarlo a esta interfaz? ¿Tiene que implementarlo?

Gracias


En Java hay dos tipos de conversión de variables de referencia:

  • Downcasting : si tiene una variable de referencia que se refiere a un objeto de subtipo, puede asignarlo a una variable de referencia del subtipo. Debe hacer una conversión explícita para hacer esto, y el resultado es que puede acceder a los miembros del subtipo con esta nueva variable de referencia.

  • Emisión ascendente : puede asignar una variable de referencia a una variable de referencia de supertipo de forma explícita o implícita. Esta es una operación intrínsecamente segura porque la asignación restringe las capacidades de acceso de la nueva variable.

, debe implementar la interfaz directa o indirectamente para habilitar la asignación de su referencia de objeto de clase al tipo de interfaz.


Esto funcionará:

class Foo implements Runnable { public void run() {} } Foo foo = new Foo(); System.out.println((Runnable) foo);

Pero esto no lo hará:

class Bar { public void run() {} } Bar bar = new Bar(); System.out.println((Runnable) bar);

Debido a que aunque Bar tiene un método run() que podría implementar Runnable.run() , Bar no está declarado para implementar Runnable por lo que no se puede convertir en Runnable .

Java requiere que declare las interfaces implementadas por nombre . No tiene escritura de pato , a diferencia de otros lenguajes como Python y Go


Hay una manera intuitiva de pensar en esto: no está cambiando un objeto con una conversión, solo está haciendo algo que ya estaría permitido si se conociera el tipo: en otras palabras, solo puede convertir a un tipo que su objeto ya es. Así que simplemente busque "arriba" de la cadena de objetos para ver qué tipos se aplican a su objeto.

Por lo tanto, puede pasar a una interfaz solo si está definido en algún lugar más arriba en la cadena (por ejemplo, si sus clases padre lo implementan, etc., etc.). Tiene que ser explícito, por su pregunta suena como si estuviera pensando que si implementa el método "void foo ()", entonces debería poder acceder a una interfaz que define el método "void foo ()". a veces se describe como "escribir pato" (si es como un pato, es un pato) pero no es cómo funciona Java.


Puede lanzar si el tipo de tiempo de ejecución de un objeto es un subtipo de lo que está intentando convertirlo.

EDITAR:

Sí, el objeto que está intentando emitir tendrá que implementar la interfaz para que pueda ejecutarlo correctamente.


Si:

interface MyInterface{} class MyClass implements MyInterface{}

Entonces

MyClass m = new MyClass(); MyInterface i = (MyInterface)m;

es posible.


Supongamos que queremos lanzar d objeto a A,

A a = (C) d;

Por lo tanto, el Compilador y la JVM verificaron internamente 3 reglas. El compilador está comprobando las 2 primeras reglas en el momento de la compilación y JVM comprobará la última regla en el tiempo de ejecución.

Regla 1 (verificación de tiempo de compilación):

El tipo de ''d'' y C deben tener alguna relación (de hijo a padre o de padre a hijo o al mismo tiempo). Si no existe una relación, obtendremos un error de compilación (tipos no convertibles).

Regla 2 (Verificación del tiempo de compilación):

''C'' debe ser del mismo tipo o tipo derivado (subclase) de ''A'', de lo contrario obtendremos un error de compilación (tipos incompatibles).

Regla 3 (Excepción de tiempo de ejecución):

El tipo de objeto de tiempo de ejecución de ''d'' debe ser el mismo o un tipo de ''C'' derivado, de lo contrario, obtendremos una excepción de tiempo de ejecución (excepción ClassCastException).

Encuentra los siguientes ejemplos para tener más idea,

String s = new String("hello"); StringBuffer sb = (StringBuffer)s; // Compile error : Invertible types because there is no relationship between. Object o = new String("hello"); StringBuffer sb = (String)o; // Compile error : Incompatible types because String is not child class of StringBuffer. Object o = new String("hello"); StringBuffer sb = (StringBuffer)o; // Runtime Exception : ClassCastException because ''o'' is string type and trying to cast into StingBuffer and there is no relationship between String and StringBuffer.