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();
}
}