ArrayList是原始类型。对泛型类型ArrayList <e>的引用应该是参数化修复导致错误

时间:2016-07-20 17:29:59

标签: java

我有一行代码在下面。

List<? extends SortKey> sortKeys = new ArrayList();

这导致警告ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized。我做了一些研究,发现了这些问题 - Collections of generics “Cannot instantiate the type ArrayList”How can elements be added to a wildcard generic collection?。所以我构建了一个public List,如下所示。

public <T extends SortKey> List<T> sortKeys() {
    List<SortKey> keys = new ArrayList<SortKey>();
    keys.add(new RowSorter.SortKey( 0, SortOrder.ASCENDING));
    keys.add(new RowSorter.SortKey( 1, SortOrder.ASCENDING));
    return keys;
}

然而,当我尝试编译此代码时,我收到错误Type mismatch: cannot convert from List<RowSorter.SortKey> to List<T>。我该如何解决这个错误?

注意
我还发现代码行List<? extends SortKey> sortKeys = new ArrayList<>();删除了警告,但我不明白为什么?如果有人花时间解释或引用可让我理解的内容,我将不胜感激。

修改
使用以下代码修复错误。

public <T extends SortKey> List<T> sortKeys() {
    List<T> keys = new ArrayList<T>();
    keys.add((T) new RowSorter.SortKey( 0, SortOrder.ASCENDING));
    keys.add((T) new RowSorter.SortKey( 1, SortOrder.ASCENDING));
    return keys;
}

然而,会产生新警告,其中说明Type safety: Unchecked cast from RowSorter.SortKey to T

1 个答案:

答案 0 :(得分:1)

对于第一个问题,您错过了new ArrayList() - &gt;上的通用括号。 new ArrayList<>()

对于第二个问题,您尝试使用SortKey(当然不会从SortKey扩展)作为列表类型。

不确定为什么要这样存储它们,因为你可以按超类类型存储子类。