以下代码(在android中运行)总是在第3行给出一个ClassCastException:
final String[] v1 = i18nCategory.translation.get(id);
final ArrayList<String> v2 = new ArrayList<String>(Arrays.asList(v1));
String[] v3 = (String[])v2.toArray();
Run Code Online (Sandbox Code Playgroud)
它也发生在v2是Object [0]时,以及当它中有字符串时.任何想法为什么?
假设你有一个arraylist定义如下:
ArrayList<String> someData = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
稍后在您的代码中,由于泛型,您可以这样说:
String someLine = someData.get(0);
Run Code Online (Sandbox Code Playgroud)
并且编译器完全知道它将获得一个字符串.是的仿制药!但是,这将失败:
String[] arrayOfData = someData.toArray();
Run Code Online (Sandbox Code Playgroud)
toArray()将始终返回一个对象数组,而不是已定义的泛型数组.为什么该get(x)方法知道它返回什么,但toArray()默认为Objects?
在Java泛型之前,Collection.toArray()无法知道开发人员期望的数组类型(特别是对于空集合).据我了解,这是成语背后的主要理由collection.toArray(new E[0]).
使用泛型,Collection<E>.toArray()只能返回一个充满实例E和/或其特化的数组.我想知道为什么返回类型仍然Object[]不是E[].在我看来,返回一个E[]而不是不Object[]应该破坏现有的代码.
请参阅:Collection.toArray(),Collection.toArray(T[])以及相关主题的java:(字符串[])List.toArray()给出ClassCastException异常
可能重复:
为什么 List<String>.toArray() 返回 Object[] 而不是 String[]?如何解决这个问题?
请参阅此代码示例:
List<String> list = new ArrayList<String>();
list.add("hello");
list.add("world");
Object [] array = list.toArray();
Run Code Online (Sandbox Code Playgroud)
为什么该方法toArray()返回一个数组Object?其他List方法如get(),remove()能够返回列表中对象的类型。
为什么List.toArray()不通用?为什么必须将类型作为参数(通常创建一个新的空实例)?
public Object[] toArray()
Run Code Online (Sandbox Code Playgroud)
http://docs.oracle.com/javase/7/docs/api/java/util/List.html#toArray()
更新:我已经知道不允许创建通用数组,但我相信它应该是.有什么理由不允许这样做吗?
Main.java:28: error: generic array creation
T[] ret = new T[size()];
Run Code Online (Sandbox Code Playgroud)
更新:好的我相信这就是答案:
http://docs.oracle.com/javase/tutorial/java/generics/restrictions.html#createArrays
不是因为它直接相关,而是间接相关.没有任何本质上的错误new T[size()],在哪里MyList<String>可以变成new String[size()],但T本身可以是参数化类型.因此,如果您要创建MyList<Set<Integer>>,那么T将等于Set<Integer>编译器将尝试创建new Set<Integer>[size()],这可能导致返回时链接中的问题.有人试图按照这些方式给出答案,但答案已被删除,所以我忘了它是谁.
例如:
List<String> items = new ArrayList<String>();
String[] aItems = items.toArray(); // type error, because toArray() returns Object[]
Run Code Online (Sandbox Code Playgroud)
我知道这是它的方式,它不能改变.当然我可以将它转换为String [],但我想知道它背后的想法是什么?这是Java中的"bug",还是有充分的理由呢?