Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中使用数组进行类型泛型?_Java_Generics_Types_Polymorphism - Fatal编程技术网

如何在java中使用数组进行类型泛型?

如何在java中使用数组进行类型泛型?,java,generics,types,polymorphism,Java,Generics,Types,Polymorphism,在java中,我想创建一个函数,它接受任何类型的内容列表,然后返回相同类型的数组。我走了这么远 public static <T>[] listToArray(List<T> items) { <T>[] names = new <T>[items.size()]; for(int i=0; i<items.size(); i+=1) { names[i] = items.get(i); } r

在java中,我想创建一个函数,它接受任何类型的内容列表,然后返回相同类型的数组。我走了这么远

public static <T>[] listToArray(List<T> items) {
    <T>[] names = new <T>[items.size()];
    for(int i=0; i<items.size(); i+=1) {
        names[i] = items.get(i);
    }
    return names;
}
publicstatic[]listToArray(列表项){
[]名称=新的[items.size()];
对于Bloch有效Java中的(int i=0;i,第25项:

…数组和泛型有非常不同的类型规则。数组是 协变的和具体化的;泛型是不变的和删除的 结果,数组提供运行时类型安全性,但不提供编译时 泛型的类型安全性,反之亦然。一般来说,数组 如果你发现自己把它们和 得到编译时错误或警告时,您的第一个冲动应该是 用列表替换数组

解释:

数组是协变的意味着如果类
扩展类
动物
,则可以执行以下操作:

Animal[] animals = new Animal[5];
animals[0] = new Dog();
这一点不适用于泛型,因为泛型是不变的:

List animals=newlinkedlist();
添加(newdog());//编译错误!!!

数组被具体化意味着所有关于数组类型的信息都将在运行时和编译时可用。同样,泛型会被删除,这意味着类型信息只在编译时存在。

如果我理解你想做什么,你需要传递第二个参数(T类)按照你这样的方法

public static <T> T[] listToArray(List<T> items, Class<T> cls) {
  T[] names = (T[]) Array.newInstance(cls, items.size());
  for (int i = 0; i < items.size(); i += 1) {
    names[i] = items.get(i);
  }
  return names;
}
publicstatict[]listToArray(列表项,类cls){
T[]names=(T[])Array.newInstance(cls,items.size());
对于(int i=0;i
以便您可以使用教程中的-

正如在非反射代码中一样,反射支持通过动态创建任意类型和维度的数组


这是必需的,因为类型
T
在运行时被擦除。通过传入类,您可以绕过此限制。

List
@omega中已经有
toArray(T[]a)
toArray()
,这意味着您不能在代码中执行
T[]names=new T[items.size();
T[]names=(T[])Array.newInstance(cls,items.size());
public static <T> T[] listToArray(List<T> items, Class<T> cls) {
  T[] names = (T[]) Array.newInstance(cls, items.size());
  for (int i = 0; i < items.size(); i += 1) {
    names[i] = items.get(i);
  }
  return names;
}