关于java:不是List< List< String>>

Isn't List<List<String>> same as List<Object>

本问题已经有最佳答案,请猛点这里访问。
1
2
3
4
5
6
7
8
9
10
11
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;
    }

如果我写下:

1
2
3
4
5
6
7
8
9
10
11
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>> to List

我有点困惑。


如果可以这样做,获得List的调用者将能够向列表中添加任何类型的对象,尽管它已声明为List>。这样会破坏列表的类型安全性:

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

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

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

Is List a supertype of List?

No, different instantiations of the same generic type for different concrete type arguments have no type relationship.
FAQ102

< /块引用>

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

What is a concrete parameterized type?

An instantiation of a generic type where all type arguments are concrete types rather than wildcards.
FAQ101

< /块引用>

更多:

  • 如何将父类型列表强制转换为子类型列表?
  • list是list的子类吗?为什么Java的泛型不是隐式多态的?
  • 为什么不编译:list>lss=new arraylist>();

来源:Java泛型常见问题:泛型和Parameterized Types