2017-10-01 2 views
1

私はJavaで「動的Enum」のようなものをモデリングしようとしています。許容値の集合を表す汎用インタフェースDomainと、特定の値を表すインタフェースPointがある。このように:このジェネリックの使用で、より正確な戻り値の型を許可する方法は?

public interface Domain<D extends Domain<D>> { 

    Set<Point<D>> points(); 

} 

public interface Point<D> { // D works a bit like a phantom type 

    public D type(); 

} 

私の意図は、静的に異なるDomainタイプからPoint秒の不慮の混入を禁止することです。

public final class Symbols implements Domain<Symbols> { 

    final Set<Point<Symbols>> symbols = new HashSet<>(); 

    public Symbols(final Set<String> values) { 
     super(); 
     for (String value : values) { 
      this.symbols.add(new SymbolPoint(value)); 
     } 
    } 

    @Override 
    public Set<Point<Symbols>> points() { 
     return symbols; 
    } 

    public class SymbolPoint implements Point<Symbols> { 

     private final String symbol; 

     ... 
    } 
} 

OK動作しているようですが、今私はバリケードを打ってきました:

は、私は次のDomain実装を持っています。 points()メソッドSymbolsにタイプSet<SymbolPoint>を返すようにします。 Set<SymbolPoint>Set<Point<Symbols>>のサブタイプではないため、どちらの方法も機能しません。それを動作させるには?

答えて

0

インターフェイスDomainは、pointsメソッドでワイルドカードを受け入れる必要があります。

interface Domain<D extends Domain<D>> { 

    Set<? extends Point<D>> points(); 

} 

あなたは今Symbols#pointsSet<SymbolPoint>Set<Point<Symbols>>を変更することができます。

+0

ありがとうございます。私は、 'Domain 、T extends Point > 'のように型パラメータを' Domain'に追加するという別の解決法があると思います。 – danidiaz

関連する問題