Java中的泛型-实例化T
我有以下Java代码:Java中的泛型-实例化T,java,generics,Java,Generics,我有以下Java代码: public static<T> void doIt(Class<T> t) { T[] arr; arr = (T[])Array.newInstance(t, 4); } 然而,我担心的是,在第一种情况下,Java编译器实际上会使用一个double类来包装double基元类型,这是我不想要的。实际上,我希望它在本例中实例化一个基元数组(同时用字符串大小写实例化一个objects数组)。有人知道doIt(double.class
public static<T> void doIt(Class<T> t)
{
T[] arr;
arr = (T[])Array.newInstance(t, 4);
}
然而,我担心的是,在第一种情况下,Java编译器实际上会使用一个double类来包装double基元类型,这是我不想要的。实际上,我希望它在本例中实例化一个基元数组(同时用字符串大小写实例化一个objects数组)。有人知道doIt(double.class)会发生什么吗?它是实例化为Double还是Double
谢谢。在这里,您实际上无法生成
t=double
——Java泛型根本无法处理基元类型。但是,您仍然可以实例化阵列:
import java.lang.reflect.*;
public class Test {
public static void main(String[] args) {
createArray(double.class);
}
private static void createArray(Class<?> clazz) {
Object array = Array.newInstance(clazz, 4);
System.out.println(array.getClass() == double[].class); // true
}
}
import java.lang.reflect.*;
公开课考试{
公共静态void main(字符串[]args){
createArray(double.class);
}
私有静态void createArray(类clazz){
objectarray=array.newInstance(clazz,4);
System.out.println(array.getClass()==double[].class);//true
}
}
这实际上取决于你以后想对数组做什么。在这里,你实际上无法生成
t=double
——Java泛型根本无法处理基元类型。但是,您仍然可以实例化阵列:
import java.lang.reflect.*;
public class Test {
public static void main(String[] args) {
createArray(double.class);
}
private static void createArray(Class<?> clazz) {
Object array = Array.newInstance(clazz, 4);
System.out.println(array.getClass() == double[].class); // true
}
}
import java.lang.reflect.*;
公开课考试{
公共静态void main(字符串[]args){
createArray(double.class);
}
私有静态void createArray(类clazz){
objectarray=array.newInstance(clazz,4);
System.out.println(array.getClass()==double[].class);//true
}
}
这实际上取决于你以后想对数组做什么。泛型将与对象一起工作,因此装箱后它应该是一个双精度的。泛型将与对象一起工作,因此装箱后它应该是一个双精度的。你可以像这样制作一个基元数组
双精度的
:
double[] arr = (double[]) Array.newInstance(double.class, 0);
但是你不能用泛型来实现这一点,因为泛型参数总是引用类型,而不是基元类型。你可以像这样创建基元
双
数组:
double[] arr = (double[]) Array.newInstance(double.class, 0);
但泛型无法实现这一点,因为泛型参数始终是引用类型,而不是基元类型。您可以创建一个采用数组类型而不是元素类型的方法,并解决类型参数必须是引用类型的问题,因为所有数组类型都是引用类型
<T> T doIt(Class<T> arrayType) {
assert arrayType.getElementType() != null;
return <T> Array.newInstance(arrayType.getElementType(), 4);
}
T doIt(类数组类型){
断言arrayType.getElementType()!=null;
返回Array.newInstance(arrayType.getElementType(),4);
}
您可以创建一个采用数组类型而不是元素类型的方法,并解决类型参数必须是引用类型的问题,因为所有数组类型都是引用类型
<T> T doIt(Class<T> arrayType) {
assert arrayType.getElementType() != null;
return <T> Array.newInstance(arrayType.getElementType(), 4);
}
T doIt(类数组类型){
断言arrayType.getElementType()!=null;
返回Array.newInstance(arrayType.getElementType(),4);
}
在调试器中尝试并检查数组的运行时类型。在调试器中尝试并检查数组的运行时类型。double.class==double.type
double.class==double.type
+1关于“以后要如何处理数组”这一关键问题<代码>数组。newInstance可以很好地创建基元数组;但不能作为类型T[]
返回。我假设OP希望从函数返回它,类型为T[]
,这将在关键问题“以后如何处理数组”上失败+1<代码>数组。newInstance可以很好地创建基元数组;但不能作为类型T[]
返回。我假设OP希望从函数返回类型为T[]
,这将失败