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>
我有点困惑。
答案 0 :(得分:4)
List<Object>
是List<String>
的超类型吗?不,不同具体类型参数的相同泛型类型的不同实例没有类型关系。 FAQ102
错误Type mismatch: cannot convert from List<List<List<String>>> to List<Object>
表示两个对象具有不同的具体参数化类型。
什么是具体的参数化类型?
泛型类型的实例化,其中所有类型参数都是具体类型而不是通配符。 FAQ101
更多:
答案 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;
}