如果我有
public <T> doSomething(T[] array)
{
}如何从array获取T.class?
如果我执行array.getClass(),将会得到T[].class。
发布于 2011-01-20 00:09:36
组件类型
使用以下命令:
array.getClass().getComponentType()返回表示数组组件类型的
Class。如果此类不表示数组类,则此方法返回null。
参考:
Class.getComponentType()安全/不安全的造型
有没有一种方法可以从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();
}下面是生成的字节代码:
public void doSomething(java.lang.Object[] array) throws java.lang.Exception;
0 aload_1 [array]
1 invokevirtual java.lang.Object.getClass() : java.lang.Class [21]
4 astore_2 [arrayClass]
5 aload_2 [arrayClass]
6 invokevirtual java.lang.Class.getComponentType() : java.lang.Class [25]
9 astore_3 [componentType]
10 aload_3 [componentType]
11 invokevirtual java.lang.Class.newInstance() : java.lang.Object [30]
14 astore 4 [newInstance]
16 return如您所见,参数类型被擦除为Object[],因此编译器无法知道T是什么。是的,编译器可以使用array.getClass().getComponentType(),但有时会失败得很糟糕,因为您可以这样做:
Object[] arr = new String[] { "a", "b", "c" };
Integer[] integerArray = (Integer[]) arr;
doSomething(integerArray);(在本例中,array.getClass().getComponentType()返回String.class,但T代表Integer。是的,这是合法的,并且不会生成编译器警告。)
发布于 2019-03-09 06:04:48
如果要对多维数组执行此操作,则可以使用以下递归代码
Class<?> getArrayType(Object array) {
Object element = Array.get(array, 0);
if (element.getClass().isArray()) {
return getArrayType(element);
} else {
return array.getClass().getComponentType();
}
}https://stackoverflow.com/questions/4737598
复制相似问题