我正在创建一种从Client Set中提取值的方法,所讨论的值是 Set 中存在的所有客户端的ID,ID 是通过调用getClientID()获得的。
我的方法:
public String[] extractIDsFromClientSet(Set<Client> clients) {
Client[] arrayClients = (Client[]) clients.toArray();
String[] clientIDs = new String[clients.size()];
for (int i = 0; i < arrayClients.length; i++) {
clientIDs[i] = arrayClients[i].getClientID();
}
return clientIDs;
}
使用我的方法时,出现以下异常:
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lmodels.Client;
at view.userPanes.UserView.extractIDsFromClientSet(UserView.java:128)
at view.userPanes.UserView.setFieldData(UserView.java:82)
如何更正我的方法?
正如开膛手杰克所说,让我们分部分进行:
toArray()
Object[] Set.toArray()
返回一个Object[]
。尽管 的所有元素Object[]
都是 的实例Client
,但这是 JVM 无法控制的,因此转换失败。此方法在 Java 5 之前出现,因此您无法更改接口以使用泛型,因为这会导致现有代码出错。解决方案是使用该方法的泛型版本,即
T[] Set.toArray(T[] a)
. 你传递它 aClient[]
(即使它是 length0
),它会返回一个Client[]
. 如果您最初已经向它传递了一个合适大小的数组,它将返回相同的数组。所以
甚至
当然,另一种选择是将数组
Object[]
重新定义为for
可迭代的
但最好的部分是,像许多集合一样,
Set
它已经实现了Iterable
,因此您不需要转换为 [] 而是可以使用增强的 for。或经典版本(虽然我推荐增强版):