cannot convert from ArrayList to ArrayList
AlstonWilliams 2016-03-29 03:19:16
这个问题很蹊跷,因为我的另一个函数的参数是Object类型的,而我传入的参数是User,一切都很正常。而我另外写了一个函数,使用的是ArrayList<Object>时,就出现了如题所示的错误。我怀疑是我的Eclipse在检查时对类型转换要求太严格,所以出现如题错误。但是找了一会也没找出来。请知道为何出现如题所示的错误的大牛解答。
另外,我将函数的形参改成Object[],而实参改为User[]时,也是不会报任何错误的。

另一个问题就是,一个函数返回了一个Object[]类型的数组,这个数组里面都是User对象,使用instanceof关键字可以判断出来,但是,使用User[] users = (Object[])getObjectArray();这行代码,却提示java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lcom.proejcthome.bean.User;错误。而我如果这么写:
Object[] users = getObjectArray();
user = (User) users[1];
System.out.println(user.getName());
则一切都工作的很好,请问到底是什么原因呢?
...全文
639 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
AlstonWilliams 2016-03-29
  • 打赏
  • 举报
回复
引用 3 楼 windowsoahil 的回复:
[quote=引用 2 楼 Mr_Pang 的回复:] [quote=引用 1 楼 windowsoahil 的回复:] java的类型转换只能在“直接的”类型之间,按照继承关系进行。 上述情况,List<T>(即泛型类)和数组中的元素类型,都不是List和数组的类型,所以不能转换。不管装着什么,它们的类型都是List或者数组。 数组的话,只能依次取出每个元素进行转换;泛型的话可以使用通配符,定义为List<? super User>可以取出User类型的对象。
你的意思是把List和数组看成一个整体对吗?如果看成一个整体的话,那类型不应该相同吗?只是里面装填的数据类型不一致。[/quote] 我的说法有问题,还是上代码:
		System.out.println(new ArrayList<Object>().getClass());
		System.out.println(new ArrayList<String>().getClass());
		System.out.println(new Object[]{}.getClass());
		System.out.println(new String[]{}.getClass());
打出: class java.util.ArrayList class java.util.ArrayList class [Ljava.lang.Object; class [Ljava.lang.String; 所以参数类型不同的List类型相同,这是肯定的,参数类型被擦除了;而数组的类型不同。再看:
System.out.println(new ArrayList<Object>() instanceof ArrayList<String>);
		System.out.println(new Object[]{} instanceof String[]);
第一行编译错误,提示信息明确建议使用通配符:Cannot perform instanceof check against parameterized type ArrayList<String>. Use the form ArrayList<?> instead since further generic type information will be erased at runtime 第二行打出false,即数组不是同一类型,互相也不遵循元素类型的继承关系。[/quote] 好的。现在明白了。多谢。
解开者 2016-03-29
  • 打赏
  • 举报
回复
引用 2 楼 Mr_Pang 的回复:
[quote=引用 1 楼 windowsoahil 的回复:] java的类型转换只能在“直接的”类型之间,按照继承关系进行。 上述情况,List<T>(即泛型类)和数组中的元素类型,都不是List和数组的类型,所以不能转换。不管装着什么,它们的类型都是List或者数组。 数组的话,只能依次取出每个元素进行转换;泛型的话可以使用通配符,定义为List<? super User>可以取出User类型的对象。
你的意思是把List和数组看成一个整体对吗?如果看成一个整体的话,那类型不应该相同吗?只是里面装填的数据类型不一致。[/quote] 我的说法有问题,还是上代码:
		System.out.println(new ArrayList<Object>().getClass());
		System.out.println(new ArrayList<String>().getClass());
		System.out.println(new Object[]{}.getClass());
		System.out.println(new String[]{}.getClass());
打出: class java.util.ArrayList class java.util.ArrayList class [Ljava.lang.Object; class [Ljava.lang.String; 所以参数类型不同的List类型相同,这是肯定的,参数类型被擦除了;而数组的类型不同。再看:
System.out.println(new ArrayList<Object>() instanceof ArrayList<String>);
		System.out.println(new Object[]{} instanceof String[]);
第一行编译错误,提示信息明确建议使用通配符:Cannot perform instanceof check against parameterized type ArrayList<String>. Use the form ArrayList<?> instead since further generic type information will be erased at runtime 第二行打出false,即数组不是同一类型,互相也不遵循元素类型的继承关系。
AlstonWilliams 2016-03-29
  • 打赏
  • 举报
回复
引用 1 楼 windowsoahil 的回复:
java的类型转换只能在“直接的”类型之间,按照继承关系进行。 上述情况,List<T>(即泛型类)和数组中的元素类型,都不是List和数组的类型,所以不能转换。不管装着什么,它们的类型都是List或者数组。 数组的话,只能依次取出每个元素进行转换;泛型的话可以使用通配符,定义为List<? super User>可以取出User类型的对象。
你的意思是把List和数组看成一个整体对吗?如果看成一个整体的话,那类型不应该相同吗?只是里面装填的数据类型不一致。
解开者 2016-03-29
  • 打赏
  • 举报
回复
java的类型转换只能在“直接的”类型之间,按照继承关系进行。 上述情况,List<T>(即泛型类)和数组中的元素类型,都不是List和数组的类型,所以不能转换。不管装着什么,它们的类型都是List或者数组。 数组的话,只能依次取出每个元素进行转换;泛型的话可以使用通配符,定义为List<? super User>可以取出User类型的对象。

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧