java中的泛型使用的问题

生死看淡,不服就干 2019-05-10 04:42:12
最近使用java泛型方法的时候发现一个问题,
public <T> T function(){}
方法大概是这样的,我需要在方法里面获取泛型T的实际类类型(T.Class),不知道要怎么获取。我先是上网查了一下,好像是说java泛型有一个类型擦除的过程,导致无法获取泛型的类类型,不是很懂,有没有人解释一下。
...全文
297 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Unicode Escapes 2019-05-11
  • 打赏
  • 举报
回复
楼主上述理解都是正确的,包括对一楼提出的将类型作为参数的理解。

Java泛型,实际上只是编译前有用,编译过后就是一般的代码。

Java编译器,会将泛型代码转换为普通的非泛型代码,将类型参数T擦除,替换为Object,
所以在编译之后就没有所谓的泛型了,也就是没有 T 的存在,因此想要在运行期根据 T 获取准确的类型是不可能的。如果必须获取,只能用1楼的说法,或者其他方式
maradona1984 2019-05-10
  • 打赏
  • 举报
回复
引用 4 楼 生死看淡,不服就干 的回复:
你这个是把它的实际类型当参数传进去,也是一个解决方法,不过这样的话我就不需要搞什么泛型方法了吧,感觉java这个泛型不是太好用啊!不过还是谢谢你了。

JAVA的泛型就是伪泛型,为了兼容低版本代码的无奈之举罢了,失去了一定的特性,但保持了兼容性,大多数人还是会选择后者
maradona1984 2019-05-10
  • 打赏
  • 举报
回复
而且你查看编译后的字节码,你会发现强转发生在调用代码处
一般的俗 2019-05-10
  • 打赏
  • 举报
回复
引用 4 楼 生死看淡,不服就干 的回复:
你这个是把它的实际类型当参数传进去,也是一个解决方法,不过这样的话我就不需要搞什么泛型方法了吧,感觉java这个泛型不是太好用啊!不过还是谢谢你了。

java的泛型还是很好用的,可以避免很多重复代码;我理解你的意思就是我上面写的例子,如果就是要获取泛型T的话,你根本不知道他的实际类型的,因为它定义的类型就是一个泛型
  • 打赏
  • 举报
回复
你这个是把它的实际类型当参数传进去,也是一个解决方法,不过这样的话我就不需要搞什么泛型方法了吧,感觉java这个泛型不是太好用啊!不过还是谢谢你了。
maradona1984 2019-05-10
  • 打赏
  • 举报
回复
引用 楼主 生死看淡,不服就干 的回复:
最近使用java泛型方法的时候发现一个问题,
public <T> T function(){}
方法大概是这样的,我需要在方法里面获取泛型T的实际类类型(T.Class),不知道要怎么获取。我先是上网查了一下,好像是说java泛型有一个类型擦除的过程,导致无法获取泛型的类类型,不是很懂,有没有人解释一下。

你只能获取到T(就是T,没别的东西),但无法获取到实际调用时的类型,反射获取到的是类加载到的信息,这个是固定不变的(至少不会因为调用方的类型变化而变化)

除了像二楼那样写,传递带有class信息的参数进来才行(Class和对象都是可以的)
一般的俗 2019-05-10
  • 打赏
  • 举报
回复
Person和Animal实体随便添加:
一般的俗 2019-05-10
  • 打赏
  • 举报
回复
使用反射原理:
public static <T> T function(Class<T> clazz) throws IllegalAccessException, InstantiationException {
T object = clazz.newInstance();
return object;
}

public static void main(String[] args) throws InstantiationException, IllegalAccessException {
Person person = function(Person.class);
System.out.println(person.getName());

Animal animal = function(Animal.class);
System.out.println(animal.getName());
}

51,412

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧