2013-02-01 33 views
3

這些接口是非常簡單的:在從屬接口上強制實施參數類型?

public interface Thawed<F> 
{ 
    F freeze(); 
} 

public interface Frozen<T> 
{ 
    T thaw(); 
} 

這工作,沒有任何問題。

但現在,我怎麼會需要ThawedF實施FrozenTFrozen實現Thawed

我能得到的最接近的是:

public interface Thawed<F extends Frozen<? extends Thawed<F>>> 

public interface Frozen<T extends Thawed<? extends Frozen<T>>> 

但是,這聽起來很遞歸......(還與Thawed<?>Frozen<?>

回答

1

我能得到的最接近的是

這是正確的答案;你不能比Java類型系統中的更好。


注意,這確實允許

class Cat implements Thawed<Dog> { } 
class HouseCat extends Cat { } 
class Dog implements Frozen<HouseCat> { } 

您可以防止通過使用兩個通用參數:

public interface Thawed<F extends Frozen<T, F>, T extends Thawed<F, T>> { } 

public interface Frozen<T extends Thawed<F, T>, F extends Frozen<T, F>> { } 

不過,我認爲這是太混亂是有益的。

這也將仍然允許

class Cat implements Thawed<Dog, HouseCat> { } 

class HouseCat extends Cat { } 

class Dog implements Frozen<HouseCat, Dog> { } 
+0

是的,使用它的類都是「最終」的 - 在我的代碼,至少。當其他人使用它時,不能保證這一點;)謝謝你清除我的疑惑! – fge

+0

@fge:第二個想法,你可以比這更好。 – SLaks

3

我認爲這應該工作:

public interface Thawed<F extends Frozen<?>> { ... } 

public interface Frozen<T extends Thawed<?>> { ... } 

我不認爲你需要更深入的東西,因爲你需要做的只是指定F是某種Frozen (並且類似地對於T)。

+1

'類Cat實現解凍''Dog類實現冷凍' – SLaks

+1

@SLaks - 但Thawed'的'定義要求'Dog'延長凍結'' (等)這是OP想要的。 OP沒有說這兩個類需要互相逆轉(例如,當你凍結一個「貓」時你返回的'Frozen')會在解凍時再次產生一個'Cat',這可能會產生狗糧。 :) –

+0

我認爲這是暗示。 – SLaks