簡體   English   中英

協變參數類型如何在java中工作

[英]How do covariant parameter types work in java

鑒於Date有一個名為“after(Date)”的方法,而Timestamp有一個覆蓋它的方法叫做“after(Timestamp)”,為什么在下面的代碼中調用Date中的after方法?

至於意外結果有人問在這里

    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());
    }

結果

one: 1266873627200
two: 1266873627000
1266873627200 not after 1266873627000

在編譯時考慮過載; 在執行時考慮覆蓋。

時間戳重載 after ,它不會覆蓋現有方法 - 所以你的oneDate.after(twoDate)只考慮java.util.Date的方法; 此外,即使你使用one.after(twoDate)仍然只使用after(Date)因為twoDate的編譯時類型是Date而不是Timestamp

如果調用one.after(two) ,然后使用Timestamp.after(Timestamp)

Date.after(Date)僅考慮毫秒 - 但Timestamp僅向Date的構造函數傳遞整數秒,因此即使您向構造函數傳遞了不同的值, oneDatetwoDateDate也具有相等的毫秒值。

值得注意的是Timestamp文檔中的這一點:

由於Timestamp類和上面提到的java.util.Date類之間存在差異,因此建議代碼不要將Timestamp值一般視為java.util.Date的實例。 Timestamp和java.util.Date之間的繼承關系實際上表示實現繼承,而不是類型繼承。

對我來說聽起來像是一個非常糟糕的繼承使用,說實話 - 然后Java有很多這些:(

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM