Java: Proč je třeba s typem obsazení pro instanceof () v rovná ()? Je to pro referenci nebo méně kódu?

hlasů
0

Java nováček tady, mám základní otázku, která je napůl zodpovězena předešlých odpovědí v ostatních nití nebo dokument, ale já stále ještě plně pochopit mechanismus a chci mít jistotu, že se vztahuje základy (kód na spodní straně, otázky střední).

V podstatě jsem přepsání rovná () metoda pro ověření, zda dvě MyDate objekty mají stejné datum. Já kontrolu instanceof pokud je objekt o je objekt MyDate, pak jste typ obsazení objekt temp konkrétně na objekt MyDate o, pak budete porovnávat data. Proč píšete obsazení temp proměnné MyDate třídy O, když už je ve třídě MyDate?

  1. Používáte temp proměnné jako snadnější odkaz na objekt, který chcete spustit se rovná) Porovnání (? Vzhledem k tomu, použití rovná () as porovnáním MyDate.equals(MyOtherDate), v kódu, pokud nemám určit proměnnou držet referenci pak dostanete různé chyby (temp nelze vyřešit za proměnné, typu nesoulad, atd podstatě kompilátor si není jistý, kde vypadat, pokud jste napsat parta více kódu).

2a. Některé z dalších nití řekl něco v tom smyslu, že zatímco instanceof kontrol v případě, že instance je ze třídy, zkontroluje základní třídu, ale nekontroluje podtřídy. Děláte obsadit, protože jste výslovně říká kompilátoru ke kontrole tohoto objektu specifické (typ odlitku z obecného objektu na objekt specifický). Poznámka: To může být verze a chuť specifický typ otázku, jsem viděl různé odpovědi na podobné otázky.

2b. Casting změní odkaz, nikoli samotný objekt. Takže v případě, že objekty jsou ze stejného druhu, avšak různé podtřídy, nebylo by to selhat při běhu namísto kompilaci. A nechtěl jsem si 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;
        }
Položena 14/01/2020 v 00:01
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
0

Java kompilátor nerozumí typu třídu vašeho objektu „O“ jako MyDate. To se stalo proto, že jste obdrželi parametr typu Object, takže to bude číst jako objekt. Aby bylo možné přistupovat k metody a vlastnosti parametru známého typu MyDate, je třeba, abyste říci kompilátoru, že se jedná o objekt typu MyDate. To je způsob, jakým kompilátor bude rozumět tomu, co děláte. Nyní se pojďme podívat na jiné pohledy dohledu.

Každé typy v Javě rozšiřuje typ Object, což znamená, že pokaždé, když napsat třídu, máte implicitně prodlužují Objectveřejné / chráněné vlastnosti a chování. To je důvod, proč jste „naléhavé“ metodu equals, která patří k Objecttypu. V pořádku, když děláte srovnání mezi dvěma objekty je třeba nejprve zjistit, zda oba patří ke stejnému typu, jak jste ve svém například s: if (o instanceof MyDate) { ... }s cílem zajistit, že oje typu MyDate. Ale v tomto okamžiku, jak jste cast „O“ na „MyDate“ psát nebudete moci specifických vlastností nebo metod přístupového MyDate je. Takže myslíte, že o tom na chvíli, když mám třídu A, která rozšiřuje svou třídu Bbudu moci přístup B veřejné metody a vlastnosti uvnitř, ale nemohu to samé na B, protože B nemůže vidět, co se děje dole strom. Řídíte?

Hope jsem mohl odpovídat na vaše pochybnosti.

Odpovězeno 14/01/2020 v 00:16
zdroj uživatelem

hlasů
2

Java má dva příbuzné, ale odděleného koncepty: o typ a jako výraz a runtime typu o hodnotu .

Tyto pojmy jsou v souladu do určité míry; v případě, že výraz má typ MyDate, pak při vyhodnocení, že exprese, buď získat odkaz na objekt, jehož runtime-typ je buď MyDatenebo podtřídy MyDate, nebo získat odkaz null, nebo získat výjimku nebo nekonečnou smyčku nebo kdoví co ještě. Ale koncepty jsou oddělené, a to i když vaše runtime-typy jsou v pořádku, někdy budete muset dát překladači nějaké další informace o typech.

> Proč typem obsazení temp proměnné MyDate třídy O, když už je ve třídě MyDate?

Proměnná oje typu Object, není vůbec typu MyDate. Stává se, že obsahuje odkaz na objekt, jehož runtime-typ je MyDate(nebo podtřídy MyDate), ale která nemá vliv na druh o. Takže napíšete (MyDate)ovytvořit výraz se stejnou hodnotou (a tedy stejnou runtime typu) a požadovaného typu.

V případě, že kompilátor byli chytřejší, mohlo by to snad zacházet ojako s typ MyDateuvnitř if-statement, takže nebudete potřebovat sádru; ale současná jazyka Java specifikace neumožňuje to. (I kdyby tomu tak bylo, mohlo by to mít nějaké podivné důsledky, pokud jde o statické metody odeslání.)

Odpovězeno 14/01/2020 v 00:21
zdroj uživatelem

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