以下代码(在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]时以及当其中有字符串时也会发生这种情况。 任何想法为什么?
答案 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);