我正在尝试使用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>
的子类型。如何使它工作?
答案 0 :(得分:0)
您的界面Domain
应接受其points
方法的通配符。
interface Domain<D extends Domain<D>> {
Set<? extends Point<D>> points();
}
您现在可以在Set<Point<Symbols>>
中将Set<SymbolPoint>
更改为Symbols#points
。