Java: De ce nevoia de tip exprimate pentru instanceof () în equals ()? Este de referință sau un cod de mai puțin?

voturi
0

Java newbie aici, am o întrebare de bază, care este pe jumătate răspuns de răspunsurile anterioare în alte fire sau docs, dar eu încă nu înțeleg pe deplin mecanismul și vreau să fiu sigur că acoperă fundamentele (codul de la partea de jos, întrebări în mijloc).

Practic, eu sunt suprascrierea egal) metoda (pentru a verifica dacă două obiecte MyDate au aceeași dată. Fac o verificare instanceof dacă obiectul este un obiect o MyDate, atunci tipul aruncat un obiect temp în mod specific la un obiect MyDate o, atunci comparați datele. De ce tastezi exprimate variabila temp la clasa MyDate de o, când deja este din clasa MyDate?

  1. Nu folosiți variabila temp ca o referință mai ușor obiectul pe care doriți să rulați egali) comparație (? Pentru că utilizați egali () , astfel cum se compară MyDate.equals(MyOtherDate), în cod , dacă nu desemnează o variabilă pentru a ține de referință atunci obține diverse erori (temp nu pot fi rezolvate ca o variabilă, nepotrivire de tip, etc , practic , compilatorul nu este sigur în cazul în care să uite dacă nu scrie un cod mai grămadă).

2a. Unele dintre celelalte fire a spus ceva de genul că în timp ce instanceof verifică dacă o instanță este dintr - o clasă, se verifică baza de clasă, dar nu verifică o subclasă. Tu faci typecasting pentru că îi comunicați în mod specific compilator pentru a verifica dacă acel obiect specific (tipul de turnare dintr - un obiect general , la un anumit obiect). NOTĂ: Acest lucru ar putea fi o întrebare versiune și specifică de tip aromă, am văzut diferite răspunsuri la întrebări similare.

2b. Turnarea se schimbă de referință, nu obiectul în sine. Deci, în cazul în care obiectele sunt din aceeași clasă, dar subclase diferite, nu ar eșua în timpul rulării, în loc de compilare. Și n-aș lua 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;
        }
Întrebat 14/01/2020 la 00:01
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
0

Compilatorul Java nu înțelege clasa tipul obiectului „o“ ca fiind MyDate. Acest lucru se întâmplă pentru că ați primit un parametru de tip Object , astfel că va fi citit ca un obiect. Pentru a avea acces la metodele și proprietățile parametrului de MyDate tip cunoscut, trebuie să spun compilatorului că acesta este un obiect de tip MyDate. Acesta este modul în care compilatorul va intelege ceea ce faci. Acum , haideți să aruncăm o privire la o altă vedere de vedere.

La fiecare tipuri în Java se extinde tipul de Objectceea ce înseamnă că de fiecare dată când scrie o clasă, ce se extinde implicit Object/ proprietățile și comportamentele protejate publice. Acesta este motivul pentru care sunt „superior“ , metoda equalscare aparține Objecttipului. În regulă, atunci când faci o comparație între două obiecte trebuie să verificați mai întâi dacă ambele dintre ele aparține aceluiași tip, așa cum ați făcut în exemplul cu: if (o instanceof MyDate) { ... }pentru a se asigura că oeste de tip MyDate. Dar , în acest moment, așa cum nu te - ai aruncat „o“ la „MyDate“ de tip nu va fi în măsură să proprietăți specifice de acces MyDate sau metode. Deci , cred că de ea pentru un timp, dacă am o clasa Acare extinde clasa mea , Bvoi fi în măsură să publice metodele de acces B și proprietăți în interiorul A, dar nu pot face același lucru pe B , deoarece B nu se poate vedea ce se întâmplă în jos copacul. Urmezi?

Hope aș putea răspunde la îndoielile tale.

Publicat 14/01/2020 la 00:16
sursa de către utilizator

voturi
2

Java are două concepte legate de -but-separate: tipul de expresie , precum și tipul de execuție al unei valoare .

Aceste concepte sunt compatibile într -o anumită măsură; în cazul în care o expresie are tip MyDate, atunci când evaluați această expresie, veți obține fie o referință la un obiect al cărui tip de execuție este fie MyDatesau o subclasă a MyDate, sau veți obține o referință nulă, sau veți obține o excepție sau buclă infinită sau fleacuri. Dar conceptele sunt separate, și chiar și atunci când tipurile de rulare-tale sunt bine, uneori ai nevoie pentru a da compilatorul unele informații suplimentare despre tipurile.

> De ce tastezi exprimate variabila temp la clasa MyDate de o, când deja este din clasa MyDate?

Variabila oeste de tip Object, nu vreodată de tip MyDate. Se întâmplă să conțină o trimitere la un obiect al cărui tip de execuție este MyDate(sau o subclasă a MyDate), dar care nu afectează tipul o. Deci , va scrie (MyDate)opentru a crea o expresie cu aceeași valoare (și , prin urmare , același tip de runtime-) și tipul dorit.

Dacă compilatorul ar mai inteligente, s- ar putea , probabil trata oca având tipul în MyDateinteriorul dvs. if-statement, astfel încât nu ar avea nevoie de distribuție; dar actualul Java limbaj de specificare nu permite acest lucru. (Și dacă a făcut -o , care ar putea avea unele implicații ciudate atunci când vine vorba de metoda de expediere statică.)

Publicat 14/01/2020 la 00:21
sursa de către utilizator

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