2011-05-29 37 views
2

在以下java代碼中,NetBeans使用或不使用@Override語句進行投訴。 如果覆蓋不存在,則會顯示返回類型Pair<Interval, Interval>Pair<ExtendedInterval, ExtendedInterval>不兼容的錯誤。解釋者建議我添加@Override語句。但是,@Override語句發生同樣的錯誤。Java:在不同返回類型的派生類中重寫方法?

讓這個錯誤消失的最好方法是什麼?我希望調用者不必將返回的對象轉換爲正確的類。

public class Interval { 
    private Date left; 
    private Date right; 

    public Pair<Interval, Interval> split(Date dt){ 
     ... 
     return new Pair<Interval, Interval>(
         new Interval(left, dt), 
         new Interval(dt, right)); 
    } 
} 

public class ExtendedInterval extends Interval { 
    private Data localData; 

    @Override 
    public Pair<ExtendedInterval, ExtendedInterval> split(Date dt){ 
     Pair<Interval, Interval> baseInterval = super.split(dt); 
     return new Pair<ExtendedInterval, ExtendedInterval>(
           new ExtendedInterval(localData, baseInterval.first()), 
           new ExtendedInterval(localData, baseInterval.second())); 
    } 
} 

回答

3

嗯,你可以改變基類方法:

public Pair<? extends Interval, ? extends Interval> split(Date dt) 

我相信會的工作。

問題是如果沒有這個,它就不是類型安全的。假設Pair有一個setFirst()方法來設置對的第一部分。然後,你可以有:

Interval x = new ExtendedInterval(); 
Pair<Interval, Interval> pair = x.split(new Date()); 
pair.setFirst(new Interval()); 

這看起來但從編譯器的點很好,但它是不可能的,你應該能夠調用setFirst(Interval)Pair<ExtendedInterval, ExtendedInterval>

現在這一切適用即使不是實際上是setFirst方法 - 因爲你不能告訴Java編譯器的Pair<>類型本身是協變;一般差異在使用類型完成。

+0

這是一個很好的解決方案。我看到的唯一不足就是將調用的結果收集到超級。 '對<?延伸Interval,?延伸Interval> baseInterval = super.split(dt);' – Colin 2011-05-29 16:35:45

+0

@Colin:是的,這是一個公平點......我不確定是否有任何事情要做,不幸的是:( – 2011-05-29 17:11:26

相關問題