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