0

だから、私はこれ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;
    }
}
4

0 に答える 0