我目前正在尝试填充Stipulations
类型的对象数组,这是一个类
public abstract interface
我填充此数组的方法如下,其中popStipAttr
是一个简单的switch语句。
public static Stipulations[] popStipArr(ZASAllocation zasAlloc)
{
//ArrayList<String> s = new ArrayList<String>();
ArrayList<Stipulations> stipAL = new ArrayList<Stipulations>();
for(int i = 0; i < NoStip; i++)
{
stipAL.add(popStipAttr(i,zasAlloc));
}
Stipulations[] StipArr = (Stipulations[]) stipAL.toArray();
return StipArr;
}
但是我收到有关投射的错误:
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lc.Stipulations;
我到底做错了什么我创建了相同类型的arraylist,为什么要将它转换为该类型的数组呢?
答案 0 :(得分:4)
ArrayList.toArray
会返回Object[]
(如消息中所述,无法转换为Stipulations[]
)。但是,ArrayList.toArray(T[] a)
会返回T[]
。因此,改变
Stipulations[] StipArr = (Stipulations[]) stipAL.toArray();
到
Stipulations[] StipArr = (Stipulations[]) stipAL.toArray(new Stipulations[0]);
^^^^^^^^^^^^^^^^^^^
哦,对。刚刚意识到可能导致混乱的原因。 [
中的前导[Ljava.lang.Object;
表示它是一个数组。 [Lc.Stipulations;
也是如此。也许这就是为什么你把从类型对象转换为类作为标题:-)现在你知道了: - )
答案 1 :(得分:0)
你在做什么
Stipulations[] StipArr = (Stipulations[]) stipAL.toArray();
正在调用java.util.List类的方法
Object[] toArray();
它会返回一个对象[],它不能被投射到你的规定[]
你想要调用的是java.util.List
<T> T[] toArray(T[] a);
将返回您的类型数组。 所以试试
Stipulations[] StipArr = stipAL.toArray(new Stipulations[stipAL.size()]);
这是一种奇怪的语法,往往会污染代码,由于这个原因以及其他一些我总是尽量使用Lists并且永远不会转换为Arrays和从Arrays转换,除非绝对必要,就像不受我控制的外部API需要它一样