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 回答