2016-09-21 50 views
0

我正在为toArray方法编写junit测试,它是ArrayBasedStack的方法之一。这个类里面有一个数组,toArray方法复制元素并返回。该方法由类给出,我试图打印出数组中的每个元素。使用toArray()方法的ClassCastException

该方法复制本地数组并返回具有对象类型的复制数组。

public T[] toArray() { 
    T[] copy = (T[]) new Object[this.size()]; 
    for (int i = 0; i < this.size(); i++) { 
     copy[i] = (T) this.myArray[i]; 
    } 

    return copy; 
} 

对于测试,余设置字符串数组作为象下面这样:

私人ArrayBasedStack堆叠;

public void setUp(){ 
    stack = new ArrayBasedStack<String>(); 
} 

要测试的toArray()方法,我想:

public void testToArray(){ 
     stack.push("000"); 
     stack.push("111"); 
     assertEquals(2, stack.toArray().length); 
     assertEquals("111", stack.toArray()[0]); 
    } 

除指定者()方法,其它方法测试通过以及如:peek()push()clear()equals() ...等

然而,仅此测试两个assertEquals返回错误:

assertEquals(2, stack.toArray().length); 
    assertEquals("111", stack.toArray()[0]); 

的错误是:

>java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String; 
     at arraystack.ArrayBasedStackTest.testToArray(ArrayBasedStackTest.java:82) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
     at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
     at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
     at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
     at org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:298) 
     at org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:292) 
     at java.util.concurrent.FutureTask.run(Unknown Source) 
     at java.lang.Thread.run(Unknown Source) 
+4

嗯,是的,你正在创建一个'Object []',然后当你调用它时,这实际上是转换为'String []',并且该转换无效。基本上,你不能在执行时不知道元素类型的情况下创建正确的数组类型。 –

+0

你有没有考虑过使用'Arrays.copyOf()'来复制内部数组?你应该能够以这种方式得到*真正的*'T []'(即'String []')。并且不需要铸造。 –

+1

这可能会有所帮助:http://stackoverflow.com/questions/529085/how-to-create-a-generic-array-in-java – uoyilmaz

回答

2
T[] copy = (T[]) new Object[this.size()]; 

这里你骗来的编译器。它不是T[],除非T[]Object[]

写这个方法正确的方法是相同的方式Collections做到这一点,通过提供一个原型,如果你幸运的话已经是正确的大小:

import java.lang.ref.Array; 

public T[] toArray(T[] a) 
{ 
    if (a.length != this.size()) 
    { 
     a = Array.newInstance(a.getClass().getComponentType(), this.size()); 
    } 
    for (int i = 0; i < this.size(); i++) 
    { 
     a[i] = (T) this.myArray[i]; 
    } 
    return a; 
} 

或者:

import java.util.Arrays; 

public T[] toArray(T[] a) 
{ 
    return Arrays.copyOf(this.myArray, this size()); 
} 
相关问题