2011-07-09 11 views
10

Przechodzę przez książkę o strukturach danych. Obecnie jestem na wykresach, a poniższy kod dotyczy części wierzchołka wykresu.java dlaczego powinien być równy parametrowi wejściowemu metody? Obiekt

class Vertex<E>{ 
    //bunch of methods 

    public boolean equals(Object o){ 
     //some code 
    } 
} 

Kiedy próbuję wdrożyć tę metodę równa mój kompilator narzeka na nie sprawdzając typ parametru i po prostu pozwalając dowolny obiekt do wysłania go. Wydaje mi się również nieco dziwne, dlaczego ten parametr nie powinien być wierzchołkiem zamiast obiektu. Czy istnieje powód, dla którego autor robi to czy jest to jakiś błąd lub staroświecki przykład?

+0

mógłbyś powtórzyć * dokładnie * Wiadomość kompilatora tutaj, proszę? –

+0

Nie widzę powodu, dla którego zaakceptowałbyś obiekt zamiast wierzchołka. – Jeremy

+0

Nazwałbym to ostrzeżeniem, a nie błędem. – adarshr

Odpowiedz

13
@Override 
public boolean equals(Object obj) 
{ 
    if(obj == null) return false; 
    else if (!(obj instanceof Vertex)) return false; 
    else return // blah blah 
} 
+1

Najpierw możesz chcieć sprawdzić, czy obiekt nie ma wartości NULL. –

+0

@Hovercraft Full Of Eels Naprawiono, dzięki –

+0

Wystarczająco fair, 1+ –

3

equals to metoda odziedziczona po Object, zdefiniowana jako wystarczająco elastyczna, aby można było wziąć dowolny obiekt i przetestować go, jeśli jest równy jakiemukolwiek innemu obiektowi (jak to słusznie powinno być możliwe), więc jak to możliwe? być w jakikolwiek inny sposób?

Edycja 1

Komentarz od jhlu87:
więc nie jest to dobra forma napisać równy sposób, który ma parametr wejściowy wierzchołka?

Zapraszamy do stworzenia własnego przeciążenie do dowolnej metody, w tym równości, ale robi to bez zmiany nazwy mogła ryzykować mylące wielu, którzy zakładają, że równa się to taka, która dziedziczy po Object. Gdyby to był mój kod i chciałem bardziej konkretnej metody równości, nazwałbym ją nieco inną niż "równa się" tylko po to, aby uniknąć zamieszania.

+0

, więc czy nie jest dobrym formularzem napisać metodę równą, która ma parametr wejściowy wierzchołka? – jhlu87

+0

@jhlu: zobacz ** Edycja 1 ** –

+2

U kogo z góry głosowałem na moją odpowiedź: proszę przynajmniej zostaw komentarz. –

10

equals (Object) to metoda zdefiniowana w katalogu głównym - Object. Jeśli nie dopasujesz dokładnie podpisu, wersja obiektu zostanie wywołana, gdy ktoś sprawdzi, czy dwa obiekty są równe. Nie tego chcesz.

Prawdopodobnie widziałeś inne metody (np. Komparator), w których możesz użyć dokładnego czasu. Dzieje się tak dlatego, że te API były generyczne z Javą 5. Równa się nie może dlatego, że poprawne jest wywoływanie równań z dwoma osobnymi typami. Powinien zwrócić wartość false, ale jest poprawna.

2

To dlatego metoda ta istniała przed rodzajowych, więc dla zachowania compatabitity musi pozostać w ten sposób.

Standardowa obejście narzucić Rodzaj:

return obj instanceof MyClass && <some condition>; 
0

To dlatego, że autor jest nadrzędne równymi. Równa jest określona w java.lang.Object i jest czymś, z czego wszystkie klasy dziedziczą.

Zobacz javadoc dla java.lang.Object

+0

Zobacz tutaj, jak poprawnie zaimplementować equals (i hashCode) http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java – Kristian

Powiązane problemy