Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.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 - Fatal编程技术网

Java初始化泛型数组

Java初始化泛型数组,java,generics,Java,Generics,T有一个实现可比较的约束。上面这一行出现异常而失败 T[] genericArray= (T[])(new Object[2]); 在T有约束的情况下,如何初始化泛型数组?对象不实现可比 不要将其创建为Object[]将其创建为Comparable[] 与您的评论相关: 变量可以声明为任何类型。创建数组时,您不是在数组中创建对象,而是只分配内存来存储对对象的引用 正如你所写: " java.lang.ClassCastException: [Ljava.lang.Object; cann

T有一个实现可比较的约束。上面这一行出现异常而失败

  T[] genericArray= (T[])(new Object[2]);

在T有约束的情况下,如何初始化泛型数组?

对象
不实现
可比

不要将其创建为
Object[]
将其创建为
Comparable[]

与您的评论相关:

变量可以声明为任何类型。创建数组时,您不是在数组中创建对象,而是只分配内存来存储对对象的引用

正如你所写:

" java.lang.ClassCastException: [Ljava.lang.Object; 
cannot be cast to [Ljava.lang.Comparable;
你也可以写

Comparable x = "Pippo"; // Because String is Comparable

对象
不实现
可比

不要将其创建为
Object[]
将其创建为
Comparable[]

与您的评论相关:

变量可以声明为任何类型。创建数组时,您不是在数组中创建对象,而是只分配内存来存储对对象的引用

正如你所写:

" java.lang.ClassCastException: [Ljava.lang.Object; 
cannot be cast to [Ljava.lang.Comparable;
你也可以写

Comparable x = "Pippo"; // Because String is Comparable

出现此错误是因为
对象
未实现
可比
,因此
对象[]
不是
可比[]
的子类型(由于类型擦除,它是
常规阵列
的运行时类型)

根本的问题是您想要创建一个通用数组。这在Java中是不可能的。原因是,与泛型不同,数组元素的类型在运行时是已知的。如果编写
newt[]
,则不知道必须创建哪种类型的数组

您试图通过创建某种超类型的数组来避免这种情况。但这也是不正确的(如果你这样做,你应该得到警告)。如果使用
新建可比[size]
创建数组,则创建的是
可比
的数组,而不是
可比
的某些子类型的数组。
T[]
可能是
String[]
Long[]
String[]
Long[]
的类型与
可比[]
(同样在运行时)不同

为了演示这个问题,考虑下面的程序:

Comparable[] x = new Comparable[1];
x[0] = "Pippo";    // Here you add a concrete String that is a
                   // Comparable type on the first position

(由于
newInstance
的返回类型是
Object
,您可能仍然会从编译器中得到警告。您可以忽略它,因为它返回的对象是一个正确类型的数组。)

由于
Object
没有实现
Comparable
,因此
Object[]
不是
Compariable[]
的子类型(由于类型擦除,它是
常规阵列的运行时类型)

根本的问题是您想要创建一个通用数组。这在Java中是不可能的。原因是,与泛型不同,数组元素的类型在运行时是已知的。如果编写
newt[]
,则不知道必须创建哪种类型的数组

您试图通过创建某种超类型的数组来避免这种情况。但这也是不正确的(如果你这样做,你应该得到警告)。如果使用
新建可比[size]
创建数组,则创建的是
可比
的数组,而不是
可比
的某些子类型的数组。
T[]
可能是
String[]
Long[]
String[]
Long[]
的类型与
可比[]
(同样在运行时)不同

为了演示这个问题,考虑下面的程序:

Comparable[] x = new Comparable[1];
x[0] = "Pippo";    // Here you add a concrete String that is a
                   // Comparable type on the first position

(由于
newInstance
的返回类型是
Object
,您可能仍然会收到编译器的警告。您可以忽略它,因为它返回的对象是正确类型的数组。)

请检查答案:为什么需要类型为
T[]
的数组?我使用了类型为T的数组,因为以后在代码中我没有[0]=…,T[1]=。。等等我需要返回所有类型为T的对象集合。不必是数组。任何集合都可以。如果您只想做
array[…]=…,则不需要将数组类型设置为
T[]
。类型为
Object[]
的数组也支持此操作。对于所有其他操作,集合(最有可能是
ArrayList
)的效果会更好。请检查答案:为什么需要
T[]
类型的数组?我使用了T类型的数组,因为在代码后面我不使用T[0]=…,T[1]=。。等等我需要返回所有类型为T的对象集合。不必是数组。任何集合都可以。如果您只想做
array[…]=…,则不需要将数组类型设置为
T[]
。类型为
Object[]
的数组也支持此操作。对于所有其他操作,集合(最有可能是
ArrayList
)将提供更好的服务。如何?您不能创建接口的实例。您可以创建接口数组。但您需要在其中添加具体元素。例如,可比[]x=新的可比[1];x[0]=“这是可比的”;从第一句话开始,您可能缺少问题的上下文(即
(T[])新对象[n]
是创建“泛型类型”数组的常用方法)T可能对其有任何约束。有没有办法不再强制执行所有这些约束?你说的是哪些约束?如何?您不能创建接口的实例。您可以创建接口数组。但您需要在其中添加具体元素。例如,可比[]x=新的可比[1];x[0]=“这是可比的”;从第一句话开始,您可能缺少问题的上下文(即
(T[])新对象[n]
是创建“泛型类型”数组的常用方法)T可能对其有任何约束。有没有办法不再强制执行所有这些约束?你说的是哪些约束?