2016-09-19 29 views
-1

我有一類這樣的:Java的向下轉換的自定義類擴展日期 - 運行時錯誤

public class DateS extends Date { 
    public DateS yesterday(){ 
     Calendar cal = Calendar.getInstance(); 
     cal.setTime(this); 
     cal.add(Calendar.DAY_OF_YEAR, -1); 
     return (DateS) cal.getTime(); 
    } 
} 

可以成功構建。在運行時,當我撥打date.yesterday()時,會丟棄Cannot cast 'java.util.Date' to 'myproject.package.DateS'

我需要知道爲什麼以及如何解決這個問題。

+0

好吧,'Calendar.getTime()'不會返回'myproject.package.DateS'的實例,所以你不能這樣做。爲了解決這個問題,你可以只返回一個Date,而不是DateS。 –

+0

在Swift上創建類的擴展時,可以爲它們添加功能。 Java中的等價物是什麼? 如何直接向Date類添加新的屬性和方法? –

+2

@JorgeHenrique沒有與java中的相同。您可能需要將返回的「Date」包裝到「DateS」類中。那麼你可以委託並添加額外的功能。 –

回答

3

因爲Calendar不會生成DateS它使用不同的實現Date

爲了投射到DateS該對象必須是DateS的實例或該類的子實例。由於Calendar未返回DateS的實例,因此無法投射。它編譯得很好,因爲理論上它可以工作,如果返回的日期是正確的類型,並且編譯器不能告訴。