2012-12-12 55 views
2

我有以下接口通用接口在Java中

public interface Group { 
    public Group add(Group g); 
    public Group sub(Group g); 
    public Group getAddInv(); 
    public boolean isZero(); 
} 

public interface Ring extends Group { 
    public Ring mul(Ring r); 
    public boolean isOne(); 
} 

我現在想使這些接口通用,以確保這些方法只能呼籲相同的代數結構的元素。

例如,它應該有可能添加環的兩個元素,但不添加組的一個元素,且環中的一個元件。

我首先想到的是用<?超級環>爲組的方法,但沒有解決。我怎樣才能做到這一點?

更新:

public interface Group<T> { 
    public T add(T g); 
    public T sub(T g); 
    public T getAddInv(); 
    public boolean isZero(); 
} 

public interface Ring<T> extends Group<Ring<T>> { 
    public T mul(T r); 
    public boolean isOne(); 
} 

那會是一個解決辦法?

+0

順便說一句,你定義接口爲全臺,或只是爲了他們的元素?我認爲你不想讓整個團體的[直接]總和,但更好的二元操作的結果,作爲一個單一的元素 - 我是對嗎? – moonwave99

+0

接口定義了單個元素。這是一個excersice我要解決編程類 - 和它的指令是可怕的...... – sge

+1

我的數學是很生疏,但我覺得一個環是不是一個集團。例如,由於0,R不是一個組,並且R *因爲... 0而不是一個環。這種違反了OO原則:一個子類對象必須是超類對象 – Jerome

回答

1

也許你想使用這樣的界面:

public interface Test<T> { 
    public void add(T t); 
} 

,然後如果你願意,你可以在你的功能使用instanceof?

1

我不會試圖通過類型系統來做到這一點。首先,正如一些評論已經提到的那樣,界面似乎很奇怪(將一個組添加到另一個組是什麼意思?)。 相反,我會重點放在什麼通常是一組完成的,哪想這

interface Group<T>{ 
    T add(T e1, T e2); //adds two elements of the group and returns the result 
    //sub is not a group operation, there is normally only one op 
    ... 
} 

同爲環,但添加mul()操作。

如果要強制執行,只有那些包含在組/環內的元素可以在操作中使用,你實現應該檢查如果參數是在組/環並拋出一個異常,如果不。該類型系統是而不是旨在執行此操作,因爲這是一個基於值的檢查,而不是類型檢查。

+0

顯然你必須爲null元素添加'T getAddInv(T)'和'T zero()'。我認爲你的想法完全合理。 – Saintali

+1

當然。我的觀點是,這項行動需要對該組織的成員進行操作,而不是針對不同的組織。如果這個可憐的傢伙從教練那裏得到了這些接口,那麼他總是被搞砸了。 – Jochen

4

它應該是這樣的:

public interface Group<T> { 
    public T add(T g); 
    public T sub(T g); 
    public T getAddInv(); 
    public boolean isZero(); 
} 

public interface Ring<T> extends Group<T> { 
    public T mul(T r); 
    public boolean isOne(); 
} 

實際實施將實現這些接口與自己的類型參數:

class MyInteger implements Ring<MyInteger>