2016-09-19 40 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的实例,因此无法投射。它编译得很好,因为理论上它可以工作,如果返回的日期是正确的类型,并且编译器不能告诉。