Java: Por que a necessidade de conversão de tipo para instanceof () in equals ()? É para referência ou código de menos?

votos
0

Novato Java aqui, eu tenho uma pergunta básica que é metade respondida por respostas anteriores em outros tópicos ou os docs, mas eu ainda não entendo completamente o mecanismo e eu quero ter certeza de que cobre os fundamentos (código na parte inferior, perguntas meio).

Basicamente, eu estou substituindo o método () é igual para verificar se dois objetos MyDate têm a mesma data. Eu faço uma verificação instanceof se o objeto o é um objeto MyDate, em seguida, digite converter um objeto temporário especificamente para um objeto MyDate o, então você comparar datas. Por que você digite converter a variável temp para MyDate classe de o, quando já é da classe MyDate?

  1. Você usa variável temporário como uma referência mais fácil o objeto que você deseja executar os iguais de comparação ()? Porque você usa equals () como comparar MyDate.equals(MyOtherDate), no código, se eu não designar uma variável para armazenar a referência, então você obter vários erros (temperatura não podem ser resolvidos como uma variável, incompatibilidade de tipo, etc, basicamente, o compilador não tem certeza de onde para olhar a menos que você escrever um código mais bando).

2a. Alguns dos outros tópicos disse algo no sentido de que, enquanto instanceof verifica se uma instância é de uma classe, ele verifica a base de classe, mas não verifica uma subclasse. Você faz o typecasting porque você está dizendo especificamente o compilador para verificar se esse objeto específico (tipo fundição de um objeto em geral para um objeto específico). NOTA: Esta pode ser uma pergunta versão e específico sabor tipo, eu vi diferentes respostas a perguntas semelhantes.

2b. Fundição muda a referência, não o objeto em si. Então, se os objetos são da mesma classe, mas diferentes subclasses, não seria falhar em tempo de execução, em vez de tempo de compilação. E eu não iria obter um 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 14/01/2020 em 00:01
fonte usuário
Em outras línguas...                            


2 respostas

votos
0

O compilador Java não entende o tipo de classe do seu objeto "o" como sendo MyDate. Isso acontece porque você recebeu um parâmetro do tipo Object por isso vai ser lido como um objeto. Para acessar os métodos e propriedades do parâmetro de um tipo conhecido MyDate, você precisa dizer ao compilador que este é um objeto do tipo MyDate. Esta é a maneira que o compilador vai entender o que você está fazendo. Agora vamos dar uma olhada para outra visão vista.

A cada tipos em Java estende o tipo Objectque significa que cada vez que você escrever uma classe, você está estendendo implicitamente as Objectpropriedades públicas / protegidas e comportamentos. É por isso que você está "imperiosas" o método equalsque pertence ao Objecttipo. Tudo bem, quando você está fazendo uma comparação entre dois objetos que você deve primeiro verificar se ambos pertencem ao mesmo tipo, como você fez no seu exemplo com: if (o instanceof MyDate) { ... }para garantir que oé do tipo MyDate. Mas neste momento, como você não rejeitou "o" para "MyDate" o tipo que você não será capaz de propriedades específicas de acesso do MyDate ou métodos. Então, pense nisso por um tempo, se eu tiver uma classe Aque se estende minha classe BI serão capazes de métodos públicos de acesso B e propriedades dentro de um, mas eu não posso fazer o mesmo no B porque B não pode ver o que está acontecendo para baixo a árvore. Você segue?

Espero que eu poderia responder às suas dúvidas.

Respondeu 14/01/2020 em 00:16
fonte usuário

votos
2

Java tem dois conceitos relacionados-mas-separado: o tipo de uma expressão , e o tipo de tempo de execução de um valor .

Estes conceitos são compatíveis até certo ponto; se uma expressão tem tipo MyDate, em seguida, quando você avaliar essa expressão, você quer obter uma referência a um objeto cujo tempo de execução-tipo é MyDateou uma subclasse de MyDate, ou você recebe uma referência nula, ou você recebe uma exceção ou loop infinito ou outros enfeites. Mas os conceitos são separados, e mesmo quando seus runtime-tipos são bons, às vezes você precisa dar o compilador alguma informação extra sobre os tipos.

> Por que você digite converter a variável temp para MyDate classe de o, quando já é da classe MyDate?

A variável oé do tipo Object, não sempre do tipo MyDate. Acontece para incluir uma referência a um objecto cujo tempo de execução de tipo é MyDate(ou uma subclasse de MyDate), mas que não afecta o tipo de o. Então você escrever (MyDate)opara criar uma expressão com o mesmo valor (e, portanto, o mesmo tempo de execução do tipo) e o tipo desejado.

Se o compilador eram mais inteligentes, talvez pudesse tratar ocomo tendo tipo MyDatedentro do seu if-Declaração, para que você não precisa o elenco; mas a corrente Java Language Specification não permite isso. (E se o fizesse, que poderia ter algumas implicações estranhas quando se trata de envio método estático.)

Respondeu 14/01/2020 em 00:21
fonte usuário

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