だから、私はこれpublic interface NodeLevel<E extends NodeLevelEnum>
を持っています。これにはメソッドpublic E getParent()
とがありpublic E getEnum()
ます。を実装するabstract public class NodeLevelAbstract<E extends NodeLevelEnum> implements NodeLevel<E>
クラスのインスタンスにデリゲートをA
実装しますpublic interface NodeLevelEnum<E extends NodeLevelEnum>
。最後の宣言は、 を実装するクラスのインスタンスが、 を実装NodeLevelEnum
するクラスのインスタンスで何かを実行できることを意味する必要がありますNodeLevelEnum
。
さて、これはNodeLevelAbstract#getParent()
:
@Override
public E getParent() {
return this.getEnum().getParent();
}
コンパイラ エラーが発生します (私は NetBeans 7.2 を使用しています)。
incompatible types
required: E
found: NodeLevelEnum
where E is a type-variable:
E extends NodeLevelEnum declared in class NodeLevelAbstract
私には、これは の子孫NodeLevelEnum
が必要であるNodeLevelEnum
が見つかったことを意味します。これは、Java Generics の境界がそれ自体を含むことを考えると、絶対的なボロックのように聞こえます。
これらのタイプに互換性がないのはなぜですか? そして、私が意図していることを行うための優雅な方法はありますか? 前もって感謝します。=)
更新 1
ところで、 をNodeLevelEnum#getParent()
返しますが<E extends NodeLevelEnum>
、NodeLevelEnum
エラーはそうすると言います。
更新 2
abstract public class NodeLevelAbstract<E extends NodeLevelEnum> implements
NodeLevel<E> {
protected E _enum;
@Override
public E getEnum() {
return this._enum;
}
@Override
public E getParent() {
return this.getEnum().getParent();
}
public static <E extends NodeLevelEnum<E>> E[] getEnumLineage(E _enum) {
ArrayList<E> ancestors = new ArrayList<>();
E currentEnum = _enum;
do {
ancestors.add(currentEnum);
currentEnum = currentEnum.getParent();
} while (currentEnum != null);
return (E[]) ancestors.toArray();
}
public static <E extends NodeLevelEnum<E>> HashMap<String, String>
getEnumLineageValueMap(
E _enum) {
HashMap<String, String> map = new HashMap<>();
for (E e : getEnumLineage(_enum)) {
map.put(e.getCode(), e.getValue());
}
return map;
}
}
public interface NodeLevel<E extends NodeLevelEnum> {
public E getEnum();
public E getParent();
}
public interface NodeLevelEnum<E extends NodeLevelEnum> {
public E getParent();
}
public interface FilestructureLevel<E extends NodeLevelEnum<E>> extends
NodeLevel<E> {
public String getPathPrefix();
}
public class FileLevel<E extends NodeLevelEnum<E>> extends NodeLevelAbstract<E>
implements FilestructureLevel<E> {
protected String _pathPrefix;
@Override
public String getPathPrefix() {
return this._pathPrefix;
}
public HashMap<String, String> getValueMap(Boolean withPath) {
return getEnumLineageValueMap(this.getEnum(), withPath);
}
public static <E extends NodeLevelEnum<E>> HashMap<String, String>
getEnumLineageValueMap(
E _enum) {
return getEnumLineageValueMap(_enum, false);
}
public static <E extends NodeLevelEnum<E>> HashMap<String, String>
getEnumLineageValueMap(
E _enum, Boolean withPath) {
HashMap<String, String> map = new HashMap<>();
FileLevelEnum[] lineage = (FileLevelEnum[]) getEnumLineage(_enum);
for (FileLevelEnum e : lineage) {
String value = !withPath ? e.getValue() : e.getPathPrefix()
+ e.getValue();
map.put(e.getCode(), value);
}
return map;
}
}