1

このように定義されたリストで add() を実行する際に問題があります

private final List<TraitGroup <? extends TRAIT_Able>> traitGroups;

理想的には、単純にしたいtraitGroups.add(TYPE);

しかし、できる限り試してみてください。ジェネリックを完全に正しく取得することはできません。

リクエストに応じて、Trait_Able インターフェイスと TraitGroup クラスは以下のとおりです...

TRAIT_Able

public interface TRAIT_Able {
String getNAME();
String toString();
}

特性グループ

@SuppressWarnings("unchecked")
public class TraitGroup <T extends TRAIT_Able>{
private final List <AbstractTrait<T>> abstractTraits;

public TraitGroup() {
    abstractTraits = new LinkedList<AbstractTrait<T>>();
}

public AbstractTrait<T>[] toArray() {
    AbstractTrait<T>[] abstractTrait = new AbstractTrait[this.abstractTraits.size()];
    for (int i =0; i < abstractTrait.length; i ++)
        abstractTrait[i] = this.abstractTraits.get(i); 
    return abstractTrait;
}

public void add(AbstractTrait<T>... source) 
{
    boolean wasFound;
    for (AbstractTrait<T> abstractTrait : source) 
    {
        wasFound = false;
        for (AbstractTrait<T> trait : this.abstractTraits) 
        {
            if (abstractTrait.equals(trait))
            {
                wasFound = true;
                trait.add(abstractTrait);
                break;
            }
        }
        if (!wasFound)
            this.abstractTraits.add(abstractTrait);
    }
}


public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append(  "Trait group: " +
                " Size: " + this.abstractTraits.size() + "\n");


    return sb.toString();
}

}
4

1 に答える 1

1

無制限のワイルドカードの問題は、それがany型を表すのではなく、型を表すことunknownです。あなたの宣言は、本質的に、平易な英語で次のように書かれています。

TRAIT_able を拡張する未知のタイプを受け入れる TraitGroup のリスト。

そしてそうではない

TRAIT_able を拡張する任意のタイプを受け入れる TraitGroup のリスト。

重要な違いです。また、型が不明であるため、コンパイラはリストに追加しようとする試みを拒否します (コンパイル時のチェックを要求しましたが、リストに追加しようとしている型が実際に有効であることをコンパイラが保証できないため) )。本質的に、異質なオブジェクトのコレクションを定義しようとしているので、リストを次のように宣言することもできます。

private final List<TraitGroup <TRAIT_Able>> traitGroups;
于 2013-03-01T23:07:47.443 に答える