Equals różnych typów

0

Cześć,
mam pytanie odnośnie equalsa.

Dlaczego, gdy porównujemy w nim różne typy mam na myśli np:

 
Integer i=110;
Long l=110L;
Byte b=110;

i.equals(l);  //dlaczego tutaj false skoro teoretycznie to te same wartości?
i.equals(b); // tu tak samo

Rozumiem, że różne typy są przechowywane na różnych ilościach bajtów ale wartości w nich są chyba te same?
Czy dobrze, podejrzewam, że chodzi o hashCode? Tzn dla każdego typu jest "obliczany" w inny sposób i dlatego się nie zgadza?

2

Wystarczy zobaczyć np do implementacji equals w klasie Integer:

    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

Po prostu twórcy Javy wybrali taką możliwość. Można by kombinować i porównywać wartości różnych typów, ale wtedy equals stałby się czasochłonny. Natomiast mechanika porównywania typów prostych jest obliczana na etapie kompilacji, więc wtedy narzutu wydajnościowego w czasie wykonywania nie ma.

0

ok, dzięki wielkie za odpowiedź i rozwianie wszelkich wątpliwości ;)

2

Ja bym patrzył na to z innej perspektywy -> z punktu widzenia semantyki. Ty wiesz że 100L i 100 są równe bo ROZUMIESZ co te dane oznaczają. Komputer NIE ROZUMIE. Komputer widzi tylko kupę zer i jedynek, nic więcej. Gdybym pokazał ci teraz zapis binarny liczby double o wartości 1.0 oraz longa 1L i zapytał czy są równe to też byś pewnie miał zagwozdkę i powiedziałbyś że nie są, bo mają tyle samo bitów a zapis binarny różny.

1 użytkowników online, w tym zalogowanych: 0, gości: 1