2010-03-09 17 views
6

Biorąc pod uwagę, że Date ma metodę o nazwie "after (Date)", a Timestamp ma metodę, która nadpisuje ją "after (Timestamp)", dlaczego metoda po w nazwie nazywa się w poniższym kodzie?Jak działają typy kowariantnych parametrów w java

Pytanie dotyczące nieoczekiwanych wyników zostało zadane here.

java.sql.Timestamp one = new java.sql.Timestamp(1266873627200L); 
    java.sql.Timestamp two = new java.sql.Timestamp(1266873627000L); 

    java.util.Date oneDate = (java.util.Date) one; 
    java.util.Date twoDate = (java.util.Date) two; 


    System.out.println("one: " + oneDate.getTime()); 
    System.out.println("two: " + twoDate.getTime()); 

    if (oneDate.after(twoDate)) { 
     System.out.println(oneDate.getTime() + " after " + twoDate.getTime()); 
    } else { 
     System.out.println(oneDate.getTime() + " not after " + twoDate.getTime()); 
    } 

wyniki

one: 1266873627200 
two: 1266873627000 
1266873627200 not after 1266873627000 

Odpowiedz

10

przeciążenia są uważane w czasie kompilacji; przesłonięcia są uwzględniane w czasie wykonywania.

Timestamp przeciążeniaafter, nie Zastąp istniejącą metodę - tak swój oneDate.after(twoDate) rozważa jedynie metody w java.util.Date; ponadto, nawet jeśli użyjesz one.after(twoDate), będzie to nadal używać tylko after(Date), ponieważ typem kompilacji twoDate jest Date zamiast Timestamp.

Jeśli zadzwonisz pod numer one.after(two), a następnie , to użyje .

Date.after(Date) uważa tylko milisekundy - ale Timestamp przechodzi tylko liczbą całkowitą sekund do konstruktora Date, więc oneDate i twoDate mają równą wartość milisekundy w Date, nawet jeśli przeszły różne wartości dla konstruktorów.

Warto zauważyć tego bitu w docs for Timestamp choć:

Ze względu na różnice między klasy datą i klasy java.util.Date wspomniano powyżej, jest zalecił kod nie zobaczyć Wartości datownika generalnie jako instancja obiektu java.util.Date. Relacja dziedziczenia między datownik i java.util.Date naprawdę oznacza dziedziczenie realizacji, i nie dziedziczenie typu.

Brzmi dość słabe wykorzystanie dziedziczenia dla mnie, aby być uczciwym - ale wtedy Java dostał mnóstwo tych :(

+0

After metodą in Data nie porównać Nano –

+0

@s_t_e_v_e: Ach -. Źle odczytałem dane wyjściowe. '! X.after (y)' nie jest tym samym co 'y.after (x)' - co sugeruje twój wynik. –

+0

OK. Powinno być teraz bardziej przejrzyste –

Powiązane problemy