java可以从范型得到class吗?

作者站长头像
站长
· 阅读数 8
    public <T> List<T> test(List<T> list) {
        Field[] fields = ReflectUtil.getFields(MenuPO.class);
        return list;
    }

T的类型在调用的时候其实就会传入MenuPO,没必要再额外传递一个参数。

回复
1个回答
avatar
test
2024-06-30

不可以,Java 泛型在编译后会擦除掉。JDK 中有不少 API 都需要传入一个 Class<T> 类型的参数,就是因为运行时不能直接从 T 拿到 Class。因为用得少,具体哪些 API 不记得了。

不过可以看看 List<E>.toArray 的两个重载,一个是 Object toArray(),不带参数,但反回类型是 Object[]。这是因为参数中不带类型,在实现的时候只能实例化 Object[] 填充后返回出来,而 Java 不能直接将其强制转换为特定类型比如 (Integer[]) Object[],所以既使声明为 T[],在运行时也是会出错的。

另外还有一个是 T[] toArray(T[] a),这个参数很有意思,来看看文档的说明

a - the array into which the elements of the list are to be stored, if it is big enough; otherwise, a new array of the same runtime type is allocated for this purpose.

意思是如果 a 足够大,就把结果放进去,不然就会产生一个新数组。所以经常会遇到传入 new Integer[0] 这样的参数,其目的不是为了往里填东西,而是为了带入一个类型。因为实现的时候是可以从参数得到 Class 再创建对应的数组,这样才可以直接以 T[] 类型返回出来。

看源代码,用到了 a.getClass()

return (T[]) Arrays.copyOf(elementData, size, a.getClass());
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容