相关疑难解决方法(0)

java:(String [])List.toArray()给出了ClassCastException

以下代码(在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]时,以及当它中有字符串时.任何想法为什么?

java list classcastexception toarray

96
推荐指数
2
解决办法
7万
查看次数

ArrayList.toArray()中的Java泛型

假设你有一个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 arrays generics

58
推荐指数
5
解决办法
1万
查看次数

为什么Java的Collection <E> .toArray()返回一个Object []而不是一个E []?

在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异常

java generics collections toarray

20
推荐指数
2
解决办法
5537
查看次数

为什么 List.toArray() 返回一个 Object 数组?

可能重复:
为什么 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()能够返回列表中对象的类型。

java collections

5
推荐指数
1
解决办法
3046
查看次数

为什么List.toArray()不通用?

为什么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://ideone.com/3nX0cz


更新:好的我相信这就是答案:

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()],这可能导致返回时链接中的问题.有人试图按照这些方式给出答案,但答案已被删除,所以我忘了它是谁.

java

5
推荐指数
1
解决办法
267
查看次数

为什么List <T> .toArray()返回通用Object []而不是T []?

例如:

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",还是有充分的理由呢?

java generics collections

0
推荐指数
1
解决办法
490
查看次数