如何在这种泛型的使用中允许更精确的返回类型?

时间:2017-10-01 22:00:44

标签: java generics

我正在尝试使用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();

}

我的目的是静态禁止意外混合来自不同Point类型的Domain

我有以下Domain实施:

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;

        ...
    }
}

似乎工作正常,但现在我遇到了障碍。我希望points()的{​​{1}}方法返回类型Symbols。这当然不起作用,因为Set<SymbolPoint>不是Set<SymbolPoint>的子类型。如何使它工作?

1 个答案:

答案 0 :(得分:0)

您的界面Domain应接受其points方法的通配符。

interface Domain<D extends Domain<D>> {

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

}

您现在可以在Set<Point<Symbols>>中将Set<SymbolPoint>更改为Symbols#points