2013-08-17 20 views
0

我有,我在我的項目中使用,我不能修改庫接口矢量...覆蓋方法與不必要的超參數

interface Vector<T> { 
    public Vector<T> plus(Vector<T> v); 
} 

然後我帶班FourVector實現它,但問題出現在覆蓋方法加。我想FourVector可能只與FourVector添加,而不是所有類型的矢量!我嘗試做的是像這樣的東西(但顯然是錯誤的)

class FourVector<T> implements Vector<T> { 
    public Vector<T> plus(FourVector<T> v) { 
    ... 
    } 
} 

有一些圖案或允許實現這種想法的解決方法嗎?

+1

那麼FourVector是一個四維矢量嗎?如果是這樣,當您向其中添加2D矢量時,如何知道要添加哪些尺寸? – Tharwen

+0

是的,它代表了Minkowski四維矢量。事實上,我想在重寫方法中防止這種不一致... – bluePhlavio

回答

1

如果您有Vector<T>,您可以在編譯時將任何類型的Vector<T>轉換爲其add方法。這就是界面設計的方式。

所以你FourVector是不是在這方面的一個真正的Vector

  • 要麼你接受,並且不要實施Vector
  • ,或者你可以添加一個運行時檢查:if (!(v instanceof FourVector)) throw new UnsupportedOperationException("Only FourVector allowed here");
0

我會改進第一個正確的評論。

在你被允許通過以下方式來覆蓋方法另一方面:

@Override 
public FourVector<T> plus(Vector<T> v) { 
    return null; 
} 

你需要認識到,界面使用簽名定義。你還需要意識到你的建議行爲會非常混亂。只要看看下面的代碼:

public void a() { 
    Vector<T> vector = new FourVector<>(); 
    b(vector); 
} 

public void b(Vector<T> v) { 
    v.plus(new ThreeVector<T>()); 
} 

如何將開發者知道,即使即使屬性是方法bVector類型,它其實FourVectorplus只有FourVector的接受方法。方法b會以某種方式知道給定屬性的確切類型。但它顯然不符合泛型接口中泛型方法的建議目的。