2014-10-04 72 views
3

其目的是允許任何兩種類型的「匹配」,只要它們遵循一個接口。也就是說,如果一個U類是可匹配到V,它實現了以下接口「多級」泛型與子類化和接口

public interface Matchable<U, V> 

,可與

public class Matcher<U extends Matchable<U, V>, V extends Matchable<V, U>> 

匹配對於一個情況下,我想匹配有着非常相似的兩個班屬性,所以我創建了一個基本的父類爲他們繼承:

public abstract class MatchingPairItem<T> implements Matchable<? extends MatchingPairItem<T>, T> 
public class ClassA extends MatchingPairItem<ClassB> 
public class ClassB extends MatchingPairItem<ClassA> 

但我明顯缺少與通用打字什麼的,接收多個錯誤,例如:

type argument ClassA is not within bounds of type-variable U 
    Matcher<ClassA, ClassB> matcher = new Matcher<ClassA, ClassB>(); 
                   ^
where U,V are type-variables: 
U extends Matchable<U,V> declared in class Matcher 
V extends Matchable<V,U> declared in class Matcher 

任何人都可以指向正確的方向嗎?

回答

2

隨着? extends MatchingPairItem<T>,你試圖建模「類型參數是類的具體類型」。這根本不是Java泛型可以模擬的東西。

我認爲最好的方法是保持MatchingPairItem有兩個類型參數,一個代表着「自我」類型:

abstract class MatchingPairItem<S, T> implements Matchable<S, T> {} 
class ClassA extends MatchingPairItem<ClassA, ClassB> {} 
class ClassB extends MatchingPairItem<ClassB, ClassA> {} 

當然,這可能擊敗一些你正在尋找方便的,但是這一個不幸的現實。