不是List <list <string>&gt;与List <object> </object> </list <string>相同

时间:2014-01-18 13:15:07

标签: java generics

public List<Object> query(){

        List<Object> listToReturn = new ArrayList<Object>();  
        List<String> listOfString = new ArrayList<String>();
        List<List<String>> listOfListOfString = new ArrayList<List<String>>();

        listOfListOfString.add(listOfString);
        listToReturn.add(listOfListOfString);

        return listToReturn;
    }

如果我写的话,而不是上面的方法:

public List<Object> query(){

        List<Object> listToReturn = new ArrayList<Object>();    
        List<String> listOfString = new ArrayList<String>();
        List<List<String>> listOfListOfString = new ArrayList<List<String>>();

        listOfListOfString.add(listOfString);

        return listOfListOfString;

    }

我收到编译时错误Type mismatch: cannot convert from List<List<List<String>>> to List<Object>

我有点困惑。

2 个答案:

答案 0 :(得分:4)

  
    

List<Object>List<String>的超类型吗?

         

不,不同具体类型参数的相同泛型类型的不同实例没有类型关系。     FAQ102

  

错误Type mismatch: cannot convert from List<List<List<String>>> to List<Object>表示两个对象具有不同的具体参数化类型

  
    

什么是具体的参数化类型?

         

泛型类型的实例化,其中所有类型参数都是具体类型而不是通配符。     FAQ101

  

更多:

来源:Java Generics FAQs - Generic And Parameterized Types

答案 1 :(得分:4)

如果你能做到这一点,那么得到List<Object>的调用者就可以将任何类型的Object添加到列表中,尽管它已被声明为List<List<String>>。因此会破坏清单的类型安全性:

List<List<String>> listOfListOfString = ...;
List<Object> listOfObjects = listOfListOfString;
listOfObjects.add(new Banana()); 
// now your list of lists of strings contains a banana: oops!

但是,您可以执行以下操作,这会阻止调用者向列表中添加任何内容:

List<?> query() { // equivalent of List<? extends Object>
    ...
    return listOfListOfString;
}