2010-03-16 83 views
1
public abstract class MyAbs implements Comparable<MyAbs> 

這將工作,但如果它們都擴展MyAbs,我將能夠比較類A和B.然而,我想完成的卻完全相反。Java通用類比較其中子類不能與彼此比較

那麼有誰知道一種方法來獲得泛型類型是自己的類?似乎是在第一次這麼簡單的事......

編輯:

解釋這一點進一步的例子。假設你有一個抽象類的動物,那麼你用狗和螞蟻擴展它。

我不想比較螞蟻與狗,但我想要比較一隻狗與另一隻狗。狗可能有一個變量,說明它是什麼顏色,這就是我想在compareTo方法中使用的。但是,當談到螞蟻時,我寧願想比較螞蟻的尺寸而不是顏色。

希望清除它。然而,可能是一個設計缺陷。

+0

爲什麼你不希望能夠比較A和B,如果他們都是MyAbs?如果有真正的原因,那麼可能你的設計是不正確的,A和/或B根本不應該擴展MyAbs。 –

+0

「比較A和B」的確切相反?沒有比較A和B?你的意思是你的比較器不適用於子類嗎?你想做什麼? –

回答

4

最直接的應該是:

public abstract class MyAbs<T> implements Comparable<T> 

或許更有效,你去Enum風格:

public abstract class MyAbs<THIS extends MyAbs<THIS>> implements Comparable<THIS> 

您可能能夠忽略的問題:

public abstract class MyAbs 

的外部Comparator我覺得更自然(也就是說,沒有一個自然順序)。

+0

這個枚舉的東西看起來很有趣,還沒有真正學會使用枚舉,所以要看看它是如何工作的。 但是我可能會爲每個子類實現可比較的。 – dege

1

只需在類B上實現類似的<MyAbs>,如果我正確解釋您的問題,則會擴展MyAbs。這樣,類B的對象可以與任何類擴展MyAbs的對象進行比較,但反之亦然。然而,如果你想要的是讓類型參數反映具體類的類型,那麼你應該可以通過Comparable一個新的類型參數。

即:

public abstract class MyAbs<T> implements Comparable<T extends MyAbs> 

但是這當然有缺點,現在你的具體類都需要自己的定義修改爲

public class ConcreteClass extends MyAbs<ConcreteClass> 

看起來kindof討厭,但它應該工作。在每個具體類上分別實現Comparable可能會更好。

+0

語法有點破碎了。 –

+0

如何?我遺漏了大括號,但除此之外它應該沒問題。 –