为什么Java不能将ArrayList <TreeSet <Integer >>转换为List <Set <Object >>?

MrD*_*ews 5 java generics

我试图做一些看似相当简单的事情:总结一组列表的大小.Netbeans给出以下警告/错误:

actual argument java.util.ArrayList<java.util.TreeSet<java.lang.Integer>> cannot be    converted to java.util.List<java.util.Set<java.lang.Object>> by method invocation conversion
Run Code Online (Sandbox Code Playgroud)

对于以下两段代码:

/**
 * Sums the sizes of all sets in a list.  Note that while there will be
 * no duplicate elements in a single set, "sister" sets may contain
 * elements, so the value returned is **not** equal to the number of unique
 * elements in all sets.
 * @param list, a List of Sets
 * @return the number of elements contained in all sets
 */
public static int sizeOfListOfSets(List<Set<Object>> list) {
    int size = 0;

    for (Set<Object> set : list) {
        size += set.size();
    }

    return size;
}
Run Code Online (Sandbox Code Playgroud)

然后使用以下内容调用它:

    ArrayList<TreeSet<Integer>> testList = new ArrayList<TreeSet<Integer>>();
    TreeSet<Integer>            testSet;
    int                         size = 0;

    testSet = new TreeSet<Integer>();
    testSet.add(new Integer(++size));
    testSet.add(new Integer(++size));
    testList.add(testSet);
    testSet = new TreeSet<Integer>();
    testSet.add(new Integer(++size));
    testList.add(testSet);

    int expResult = size;
    int result    = Helpers.sizeOfListOfSets(testList);
Run Code Online (Sandbox Code Playgroud)

最后一行给出了编译错误:

error: method sizeOfListOfSets in class Helpers cannot be applied to given types;
1 error
Run Code Online (Sandbox Code Playgroud)

那么,为什么java.lang.Integer不能转换为java.lang.Object?

Pet*_*hev 14

A List<Integer>不是List<Object>.如果Java允许,那么你可以调用方法,List<String>你就会被打破.正如Jeremy Heiler你所指出的,你可以使用List<? extends Object>,你会没事的.这意味着Object允许扩展的每种类型.在通用术语中?称为a wildcard.