incompatible types: ArrayList<ArrayList<Integer>> cannot be converted to List<List<Integer>>
2018-01-25 10:04
681 查看
这个错误出现在我试图用一个 ArrayList<ArrayList<Integer>>() new 一个 List<List<Integer>> 对象的时候
也许我们会发现 把第二个 ArrayList 改成 List ,错误就没有了,那么原理是什么呢?
经查找发现,这是一个 泛型 应用的常踩坑:
https://docs.oracle.com/javase/tutorial/java/generics/inheritance.html
1. 首先,如果 A is a B , 我们可以把 A 赋值给 B
Integer 继承自 Object,是它的一个子类型, 所以这样赋值没有问题,这是泛型。
2. Integer 也是一种 Number, Double 也是一种 Number,所以下面这样也是可以的
也可以使用泛型:
3. 重点来了
如果这样,我们可以传入 Box<Integer> 或者 Box<Double> 吗
答案是否定的。
Integer 是 Number 的子类,Double 也是 Number 的子类, 但是,Box<Integer> 和 Box<Double>
都不是 Box<Integer> 的子类,它们的关系是并列的,都是 Object 的子类。
List<List<Integer>> = new ArrayList<ArrayList<Integer>>();
也许我们会发现 把第二个 ArrayList 改成 List ,错误就没有了,那么原理是什么呢?
经查找发现,这是一个 泛型 应用的常踩坑:
Generics, Inheritance, and Subtypes
https://docs.oracle.com/javase/tutorial/java/generics/inheritance.html1. 首先,如果 A is a B , 我们可以把 A 赋值给 B
Object someObject = new Object(); Integer someInteger = new Integer(10); someObject = someInteger; // OK
Integer 继承自 Object,是它的一个子类型, 所以这样赋值没有问题,这是泛型。
2. Integer 也是一种 Number, Double 也是一种 Number,所以下面这样也是可以的
public void someMethod(Number n) { /* ... */ } someMethod(new Integer(10)); // OK someMethod(new Double(10.1)); // OK
也可以使用泛型:
Box<Number> box = new Box<Number>(); box.add(new Integer(10)); // OK box.add(new Double(10.1)); // OK
3. 重点来了
public void boxTest(Box<Number> n) { /* ... */ }
如果这样,我们可以传入 Box<Integer> 或者 Box<Double> 吗
答案是否定的。
Integer 是 Number 的子类,Double 也是 Number 的子类, 但是,Box<Integer> 和 Box<Double>
都不是 Box<Integer> 的子类,它们的关系是并列的,都是 Object 的子类。
相关文章推荐
- The type List is not generic; it cannot be parameterized with arguments <Integer>
- net.sf.ezmorph.bean.MorphDynaBean cannotbe cast to xxx 关于JSON对象解析List<XXX>在调用时出错问题
- java.lang.RuntimeException: Value <pre>bool(false) of type java.lang.String cannot be converted to J
- struts2的<s:iterator>标签 遇到的问题:java.lang.ClassCastException:cannot be cast to java.lang.String
- Cannot instantiate the type List<Integer>
- The type List is not generic; it cannot be parameterized with arguments<T>
- List is a raw type. References to generic type List<E> should be parameterized
- How to convert List<Integer> to int[] in Java?
- the type List is not generic; it cannot be parameterized with arguments<T>解决办法
- Java: Best way of converting List<Integer> to List<String>
- Cannot instantiate the type List<Integer>
- Java 面试题之反射的应用(如何在List<String> list = new ArrayList<String>();中放入Integer类型的数据)
- DataTable扩展方法ToList<T>()、ToJSON()、ToArrayList()
- Hive ClassCastException java.util.ArrayList cannot be cast to ListObjectInspector
- value <html><head>java.lang. String connot be converted to jsonobject
- ArrayList<Integer> list = new ArrayList<Integer>(); 在这个泛型为Integer的ArrayList中存放一个String类型的对象。
- 错误:Property of 'java.util.Set<?>' type cannot be injected by 'List'的解决方案
- ArrayList<Integer> list = new ArrayList<Integer>();在这个泛型为 Integer 的 ArrayList 中存放一个 String 类型的对象。
- JSP报编译错 Arraylist cannot be resolve to a type
- BeanUtils<T1, T2> beanToBean