Java泛型和数组';s

Java泛型和数组';s,java,generics,Java,Generics,当我在单元测试中运行此代码时,下面的代码片段仍然有意义。。我在标有“>>>”的行上得到一个ClassCastException(对象不能转换为字符串)。这种类型的操作可以在泛型中完成吗 public class ArrayUtils<E> { public static <E> E[] appendToArray(E[] array, E item) { E[] result = (E[])new Object[array.length+1];

当我在单元测试中运行此代码时,下面的代码片段仍然有意义。。我在标有“>>>”的行上得到一个ClassCastException(对象不能转换为字符串)。这种类型的操作可以在泛型中完成吗

public class ArrayUtils<E> {

    public static <E> E[] appendToArray(E[] array, E item) {
        E[] result = (E[])new Object[array.length+1];
        for(int i=0; i < array.length; i++ ) {
            result[i] = array[i];
        }
        result[result.length-1] = item;
        return result;
    }

}

   @Test
   public void testAppendToArray() {
       String[] array = new String[1];
       array[0] = "a";

       assertSame("Array is not correct length.", 1, array.length );
>>>>   String[] appendToArray = ArrayUtils.<String>appendToArray(array, "b");
       assertSame("Array is not correct length.", 2, appendToArray.length );
    }
公共类数组直到{
公共静态E[]appendToArray(E[]数组,E项){
E[]结果=(E[])新对象[array.length+1];
for(int i=0;i>>>字符串[]appendToArray=ArrayUtils.appendToArray(数组,“b”);
assertSame(“数组长度不正确。”,2,appendToArray.length);
}

您正在将
对象
强制转换为
字符串
,IOW是继承对象的超类。 它总是被禁止的。正如AlexR所建议的,使用
数组。newInstance()
。但在这种情况下,您必须传递对象的一个类,如下所示:

ArrayUtils.<String>append(array, "b", String.class);
ArrayUtils.append(数组,“b”,String.class);

我建议您不要尝试实现动态扩展数组的这个标准行为:它已经在
ArrayList
类中实现了。您可以检查源代码以了解它如何处理泛型

您正在将
对象
强制转换为
字符串
,IOW是继承对象的超类。 它总是被禁止的。正如AlexR所建议的,使用
数组。newInstance()
。但在这种情况下,您必须传递对象的一个类,如下所示:

ArrayUtils.<String>append(array, "b", String.class);
ArrayUtils.append(数组,“b”,String.class);

我建议您不要尝试实现动态扩展数组的这个标准行为:它已经在
ArrayList
类中实现了。您可以检查源代码以了解它如何处理泛型

不应使用新对象[]创建数组。您应该使用
Array.newInstance(类clazz,int-length)

您不应该使用新对象[]创建数组。您应该使用
Array.newInstance(Class clazz,int-length)

我不知道这段代码是干什么的,但它给垃圾收集器增加了负担,因为要添加一个元素,就要分配一个新数组。为此,您应该使用
List
的任何实现,例如,
ArrayList

我不知道这段代码是干什么用的,但它会给垃圾收集器带来负担,因为要添加一个元素,就要分配一个新数组。为此,您应该使用
List
的任何实现,例如,
ArrayList

不幸的是,在Java中无法动态创建泛型类型的数组,因为与泛型类型(
E
)相关的信息不会在运行时携带,因此无法知道要创建哪种类型的数组

为了解决这个问题,我建议用类似的方法来解决这个问题

方法。也就是说,不要在
appendToArray
函数中创建新数组,而是从外部传递它。即:

public static <E> E[] appendToArray(E[] array, E item, E[] newArray) {
  ... your code ...
}

@Test
public void test(){
  appendToArray(array, "b", new String[array.length+1]);
}
反射等效法

T[] java.util.List.toArray()

不幸的是,在Java中无法动态创建泛型类型的数组,因为与泛型类型(
E
)相关的信息不会在运行时携带,因此无法知道要创建什么类型的数组

为了解决这个问题,我建议用类似的方法来解决这个问题

方法。也就是说,不要在
appendToArray
函数中创建新数组,而是从外部传递它。即:

public static <E> E[] appendToArray(E[] array, E item, E[] newArray) {
  ... your code ...
}

@Test
public void test(){
  appendToArray(array, "b", new String[array.length+1]);
}
反射等效法

T[] java.util.List.toArray()

正如其他人所说,您应该使用
Array.newInstance()
创建正确类型的数组实例。更有用的是,您可以从原始数组的类中获取所需的组件类型

此外,我还使用
System.arraycopy()
简化了复制过程

公共静态E[]附件数组(E[]数组,E项){
E[]result=(E[])java.lang.reflect.Array.newInstance(Array.getClass().getComponentType(),Array.length+1);
数组复制(数组,0,结果,0,数组,长度);
结果[结果长度-1]=项目;
返回结果;
}
在Java 1.6+中,您可以执行以下操作:

public static <E> E[] appendToArray(E[] array, E item) {
    E[] result = java.util.Arrays.copyOf(array, array.length+1);
    result[result.length-1] = item;
    return result;
}
公共静态E[]附件数组(E[]数组,E项){
E[]result=java.util.Arrays.copyOf(array,array.length+1);
结果[结果长度-1]=项目;
返回结果;
}

正如其他人所说,您应该使用
Array.newInstance()
创建正确类型的数组实例。更有用的是,您可以从原始数组的类中获取所需的组件类型

此外,我还使用
System.arraycopy()
简化了复制过程

公共静态E[]附件数组(E[]数组,E项){
E[]result=(E[])java.lang.reflect.Array.newInstance(Array.getClass().getComponentType(),Array.length+1);
数组复制(数组,0,结果,0,数组,长度);
结果[结果长度-1]=项目;
返回结果;
}
在Java 1.6+中,您可以执行以下操作:

public static <E> E[] appendToArray(E[] array, E item) {
    E[] result = java.util.Arrays.copyOf(array, array.length+1);
    result[result.length-1] = item;
    return result;
}
公共静态E[]附件数组(E[]数组,E项){
E[]result=java.util.Arrays.copyOf(array,array.length+1);
结果[结果长度-1]=项目;
返回结果;
}

有什么原因导致这个`E[]结果=(E[])新对象[array.length+1];`不能是
E[]result=newe[array.length+1](我没有做太多的Java泛型,也许这是禁止的,但似乎它会解决它?@Noon Silk,这是禁止的,因为E甚至不是一个类,而是一个TypeParameter。老实说,留下引用数组。这有什么原因吗`E[]结果=(E[])新对象[array.length+1];`不能是
E[]result=newe[array.length+1](也许我没有做过太多Java泛型