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