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

时间:2011-04-16 23:25:19

标签: java list classcastexception toarray

以下代码(在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();

当v2是Object [0]时以及当其中有字符串时也会发生这种情况。 任何想法为什么?

5 个答案:

答案 0 :(得分:226)

这是因为当你使用

 toArray() 

它返回一个Object [],它不能转换为String [](即使内容是字符串)这是因为toArray方法只得到一个

List 

而不是

List<String>

因为泛型是仅源代码的东西,并且在运行时不可用,因此它无法确定要创建的数组类型。

使用

toArray(new String[v2.size()]);

分配正确类型的数组(String []和正确大小)

答案 1 :(得分:34)

您使用了错误的toArray()

请记住,Java的泛型主要是语法糖。 ArrayList实际上并不知道它的所有元素都是字符串。

要解决您的问题,请致电toArray(T[])。在你的情况下,

String[] v3 = v2.toArray(new String[v2.size()]);

请注意,通用格式toArray(T[])会返回T[],因此不需要显式转换结果。

答案 2 :(得分:0)

String [] str =新的String [list.size()];

str =(String [])list.toArray(str);

像这样使用。

答案 3 :(得分:0)

import os

def openx():
     print("in openx")      
     # this is to ensure that the program control reaches inside openx() function
     # the program control does reach inside the openx() function
     os.system('python homepage.py')

def func(u,p):
     import mysql.connector as sql
     chk = 0
     mycon  = sql.connect(host = 'localhost', user = 'root', 
                          passwd = 'password', database = 'pythoncon')
     cursor = mycon.cursor()
     cursor.execute("CREATE TABLE IF NOT EXISTS userdata (name varchar(50),  passwd varchar(50), dob date, phno int(10) primary key, emid varchar(50))")     
     cursor.execute("select * from userdata")
     row = cursor.fetchall()
     for i in row :
          if (i[0]==u and i[1]==p):
               chk = 1
               break
          else :
               chk = 0
               continue
     if chk==1:
          loginsuccess = Label(home,text="Login Successful. ", 
                               font = ('Times New Roman',30)).grid(row=6,column=1)
          home.after(2000, lambda : home.destroy())
          Button(home,text = "Click here to proceed", command = openx)\
              .grid(row=7,column=1,columnspan=4, sticky=W)

     else :
          loginfail = Label(home,text="Incorrect login details, please try again.", 
                            font = ('Times New Roman',25),
                            wraplength=230, bg = "#8f00ff")\
                              .grid(row=7,column=2)
          login.delete(0,END)
          passwd.delete(0,END)
     mycon.close()

也能解决问题, 请注意,一旦为该方法指定了正确的ArrayType,您甚至不需要转换。

答案 4 :(得分:0)

使用 JDK 11 Stream API 中的 toArray,您可以这样解决更一般的问题:

Object[] v1 = new String[] {"a", "b", "c"}; // or array of another type
String[] v2 = Arrays.stream(v1)
    .<String>map((Object v) -> v.toString()).toArray(String[]::new);