Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.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中的泛型-实例化T_Java_Generics - Fatal编程技术网

Java中的泛型-实例化T

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

我有以下Java代码:

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[]
,这将失败