Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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_Arrays_Generics - Fatal编程技术网

java:获取数组组件的类

java:获取数组组件的类,java,arrays,generics,Java,Arrays,Generics,如果我有 public <T> doSomething(T[] array) { } public doSomething(T[]数组) { } 如何从array获取T.class 如果我做了array.getClass(),那就得到了T[].class。组件类型 使用以下命令: array.getClass().getComponentType() 返回表示 数组的组件类型。如果这 类不表示数组 类此方法返回null 参考资料: 安全/不安全铸造 有什么方法可以让我投

如果我有

public <T> doSomething(T[] array)
{
}
public doSomething(T[]数组)
{
}
如何从
array
获取
T.class

如果我做了
array.getClass()
,那就得到了
T[].class

组件类型 使用以下命令:

array.getClass().getComponentType()
返回表示 数组的组件类型。如果这 类不表示数组 类此方法返回
null

参考资料:


安全/不安全铸造 有什么方法可以让我投到课堂上吗 从返回的类 getComponentType()而不获取 编译器警告

采取这种方法:

public <T> void doSomething(final T[] array) throws Exception{
    final Class<? extends Object[]> arrayClass = array.getClass();
    final Class<?> componentType = arrayClass.getComponentType();
    final T newInstance = (T) componentType.newInstance();
}
如您所见,参数类型被擦除为Object[],因此编译器无法知道T是什么。是的,编译器可以使用
array.getClass().getComponentType()
,但有时会失败,因为您可以执行以下操作:

Object[] arr = new String[] { "a", "b", "c" };
Integer[] integerArray = (Integer[]) arr;
doSomething(integerArray);

(在本例中,
array.getClass().getComponentType()
返回
String.class
,但
T
代表
整数
。是的,这是合法的,不会生成编译器警告。)

如果要对多维数组执行此操作,以下递归代码将起作用

    Class<?> getArrayType(Object array) {
        Object element = Array.get(array, 0);
        if (element.getClass().isArray()) {
            return getArrayType(element);
        } else {
            return array.getClass().getComponentType();
        }
    }

类getArrayType(对象数组){
Object元素=Array.get(数组,0);
if(element.getClass().isArray()){
返回getArrayType(元素);
}否则{
返回数组.getClass().getComponentType();
}
}

很酷,谢谢。有没有一种方法可以从getComponentType()返回的类强制转换到类而不得到编译器警告?@Jason S:我不认为有什么方法可以这样做,因为编译器不知道强制转换到什么。是的,但是我想
Class
只是
Class
在类型擦除之后。当然,我理解运行时的问题,但是泛型的全部要点是编译器在编译时知道在擦除步骤之前是什么类型。。。酷,谢谢你的详细讨论和反例。我忘记了数组是协变的(?我是否正确地获得了vocab),因此字符串[]也是对象[]。大量的+1…(注意,[即使非
null
]数组也可以是
String[]
给出
String.class
,但是
T
可以是
CharSequence
。最好避免引用数组和反射。“最好避免反射”:当然,但在我的例子中,T是一个枚举,我接受一个T[],执行一些计算并返回需要类作为构造函数参数的EnumMap。
    Class<?> getArrayType(Object array) {
        Object element = Array.get(array, 0);
        if (element.getClass().isArray()) {
            return getArrayType(element);
        } else {
            return array.getClass().getComponentType();
        }
    }