Java: ¿Por qué la necesidad de conversión de tipo de instanceof () en iguales ()? ¿Es por referencia o código de menos?

votos
0

Java novato aquí, tengo una pregunta básica que se contestó la mitad por las respuestas anteriores en otros hilos o los documentos, pero todavía no entienden completamente el mecanismo y yo quiero estar seguro que cubre los fundamentos (código en la parte inferior, en preguntas medio).

Básicamente, estoy reemplazando el método () iguales para comprobar si dos objetos mydate tienen la misma fecha. Hago un cheque instanceof o si el objeto es un objeto MiFecha, entonces tipo lanzas un objeto temp específicamente a un objeto MiFecha o, a continuación, se comparan las fechas. ¿Por qué tipo de moldear la variable temporal a la clase MiFecha de o, cuando ya es de la clase MiFecha?

  1. Cómo se utiliza la variable temporal como una referencia más fácil el objeto que desea ejecutar los iguales comparación ()? Debido a que se utiliza iguales () como la comparación MyDate.equals(MyOtherDate), en el código si no designa una variable para contener la referencia luego te varios errores (temp no se puede resolver como una variable, el tipo de desajuste, etc, básicamente, el compilador no está seguro de dónde a ver a menos que escribe un código más racimo).

2a. Algunos de los otros hilos dijo algo en el sentido de que mientras instanceof comprueba si es una instancia de una clase, comprueba la base de clase, pero no comprueba una subclase. Usted hace el encasillamiento porque usted está diciendo específicamente el compilador para comprobar si ese objeto específico (tipo de fundición de un objeto general a un objeto específico). NOTA: Esto podría ser una pregunta versión específica y sabor tipo, he visto diferentes respuestas a preguntas similares.

2b. De fundición cambia la referencia, no el objeto en sí. Por lo tanto, si los objetos son de la misma clase, pero diferentes subclases, ¿no fallan en tiempo de ejecución, en lugar de tiempo de compilación. Y no iba a conseguir un ClassCastException?

public boolean equals(Object o) {
            if (o instanceof MyDate) {
                MyDate temp = (MyDate) o;
                if ((temp.day == day) && (temp.month == month) && (temp.year == year)) {
                    return true;
                }
            } 
            return false;
        }
Publicado el 14/01/2020 a las 00:01
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
0

El compilador de Java no entiende la clase de características de su objeto "o" como MiFecha. Esto sucede debido a que ha recibido un parámetro del tipo de objeto por lo que se puede leer como un objeto. Con el fin de acceder a los métodos y propiedades del parámetro de MiFecha tipo conocido, es necesario indicar al compilador que se trata de un objeto de tipo MyDate. Esta es la forma en que el compilador va a entender lo que está haciendo. Ahora vamos a echar un vistazo a otra vista de la vista.

Cada tipo de Java se extiende el tipo Objectlo que significa que cada vez que se escribe una clase, usted está implícita la ampliación de las Objectpropiedades públicas / protegidas y comportamientos. Es por eso que está "superior" el método equalsque pertenece a la Objecttipo. Muy bien, cuando estás haciendo una comparación entre dos objetos que se debe comprobar primero si ambos de ellos pertenece al mismo tipo, como lo hizo en su ejemplo con: if (o instanceof MyDate) { ... }para asegurarse de que oes de tipo MyDate. Pero en este punto, ya que no había desechado "o" para "MiFecha" escriba usted no será capaz de propiedades o métodos específicos de acceso mydate. Así que pienso en ello durante un tiempo, si tengo una clase Aque se extiende mi clase Bvoy a ser capaz de métodos públicos de acceso B y propiedades dentro de una, pero no puedo hacer lo mismo en B porque B no puede ver lo que está pasando abajo el árbol. ¿Usted sigue?

Esperanza de que pudiera responder sus dudas.

Respondida el 14/01/2020 a las 00:16
fuente por usuario

votos
2

Java tiene dos conceptos relacionados, pero-separados: el tipo de una expresión , y el tipo de ejecución de un valor .

Estos conceptos son compatibles hasta cierto punto; Si una expresión tiene tipo MyDate, a continuación, cuando se evalúa esa expresión, que o bien obtener una referencia a un objeto cuyo tipo de tiempo de ejecución es o bien MyDateo una subclase de MyDate, o bien obtener una referencia nula, o bien obtener una excepción o bucle infinito o lo que sea. Pero los conceptos son independientes, e incluso cuando su tiempo de ejecución tipos están muy bien, a veces se necesita para dar el compilador alguna información adicional acerca de los tipos.

> ¿Por qué tipo de moldear la variable temporal a la clase MiFecha de o, cuando ya es de la clase MiFecha?

La variable oes de tipo Object, no siempre del tipo MyDate. Sucede para contener una referencia a un objeto cuyo tipo de tiempo de ejecución es MyDate(o una subclase de MyDate), pero que no afecta el tipo de o. Así se escribe (MyDate)opara crear una expresión con el mismo valor (y por lo tanto el mismo tipo de tiempo de ejecución) y el tipo deseado.

Si el compilador eran más inteligentes, podría tal vez tratar ode tener tipo MyDatedentro de su if-statement, por lo que no se necesita el elenco; pero la corriente del lenguaje Java especificación no permite eso. (Y si lo hiciera, que podría tener algunas implicaciones extrañas cuando se trata de la expedición método estático.)

Respondida el 14/01/2020 a las 00:21
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more