代码之家  ›  专栏  ›  技术社区  ›  Eternal Noob

类型不匹配错误

  •  2
  • Eternal Noob  · 技术社区  · 15 年前

    我正在创建一个字符串列表,

    List<List<String>> string= new ArrayList<ArrayList<String>>();
    

    获取类型不匹配错误:无法从 ArrayList<ArrayList<String>> List<List<String>> .

    我知道我可以改变

    List<List<String>> to ArrayList<ArrayList<String>>
    

    它会工作得很好。

    但我只是想知道为什么不让它发生?简单的 List<Object> 可以参考 ArrayList<Object> 那么这有什么不同呢?

    4 回复  |  直到 15 年前
        1
  •  1
  •   cdhowie    15 年前

    因为 List<List<String>> 将接受其他不是数组列表的字符串列表,这不是最初声明类型的方式。例如,如果转换为 列表<列表<字符串>> ,技术上允许您添加 LinkedList<String> 去吧!那不是 ArrayList<String> . 允许该转换将有效地破坏泛型类型系统。

    换句话说,你 能够 转换为 List<ArrayList<String>> . 但不是 列表<列表<字符串>> .

        2
  •  1
  •   Jose Diaz    15 年前
    List<List<String>> string = new ArrayList<List<String>>()
    

    会是正确的方法。

    当做,

        3
  •  1
  •   Chandra Patni    15 年前

    您不能分配 ArrayList<ArrayList<String>> List<List<String>> 因为它违反了泛型的编译时类型安全承诺。如果此分配有效,则可以插入 LinkedList<String> 进入之内 ArrayList<ArrayList<字符串>> 破坏类型安全。

    典型的例子是 List<Number> 不是 List<Integer> . 矛盾很容易表现出来。

    List<Integer> ints = new ArrayList<Integer>();
    ints.add(42);
    
    //This results in compiler error
    /* List<Number> nums = ints;  */
    //If it were not and an error, then you could 
    
    List<Number> nums = ints;
    //Now you can insert doubles into a list of `Number`s
    nums.add(0.1);
    
    //This would allow 0.1 to assign to an int  
    Integer x=ints.get(1); 
    //This will cause ClassCastException and 
    //violate type-safety provided by generics.
    
        4
  •  0
  •   AlexR    15 年前

    除了男人们已经说过的,我想注意到你写的定义: 阵列列表() 对你有用但不够好。

    你应该说:

    List>List=new ArrayList>();

    如果存在抽象类或接口,则规则永远不会将具体类写入泛型定义和赋值的左侧部分。我的版本允许以后更改列表实现,而不必更改使用此数据结构的代码。

    此外,List是一个集合。如果您使用特定列表的特性(例如,如果您只在该列表上迭代)并不重要,您可以说:

    Collection>list=new ArrayList>();

    在这种情况下,将来甚至可以将列表更改为:

    Collection>list=new LinkedHashSet>();