public <T> List<T> test(List<T> list) {
Field[] fields = ReflectUtil.getFields(MenuPO.class);
return list;
}
T的类型在调用的时候其实就会传入MenuPO,没必要再额外传递一个参数。
public <T> List<T> test(List<T> list) {
Field[] fields = ReflectUtil.getFields(MenuPO.class);
return list;
}
T的类型在调用的时候其实就会传入MenuPO,没必要再额外传递一个参数。
3 回答2.6k 阅读✓ 已解决
3 回答4.1k 阅读✓ 已解决
8 回答3.6k 阅读
4 回答2.7k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
3 回答1.7k 阅读✓ 已解决
不可以,Java 泛型在编译后会擦除掉。JDK 中有不少 API 都需要传入一个
Class<T>
类型的参数,就是因为运行时不能直接从T
拿到Class
。因为用得少,具体哪些 API 不记得了。不过可以看看
List<E>.toArray
的两个重载,一个是Object toArray()
,不带参数,但反回类型是Object[]
。这是因为参数中不带类型,在实现的时候只能实例化Object[]
填充后返回出来,而 Java 不能直接将其强制转换为特定类型比如(Integer[]) Object[]
,所以既使声明为T[]
,在运行时也是会出错的。另外还有一个是
T[] toArray(T[] a)
,这个参数很有意思,来看看文档的说明意思是如果 a 足够大,就把结果放进去,不然就会产生一个新数组。所以经常会遇到传入
new Integer[0]
这样的参数,其目的不是为了往里填东西,而是为了带入一个类型。因为实现的时候是可以从参数得到 Class 再创建对应的数组,这样才可以直接以T[]
类型返回出来。看源代码,用到了
a.getClass()