首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于泛型和反射的Java基础知识

关于泛型和反射的Java基础知识
EN

Stack Overflow用户
提问于 2016-04-17 14:36:19
回答 2查看 44关注 0票数 0

我有一个基本的java问题,因为我最近决定深入研究这个语言(我已经专门使用C++很长时间了,并且决定扩大我的视野)。

假设我有一个名为BankAccount的类,并且我尝试在主目录中创建和对象,那么在以下几个方面之间有什么区别:

代码语言:javascript
复制
Class baCls = BankAccount.class; 

代码语言:javascript
复制
Class<BankAccount> baCls = BankAccount.class;

在每一种情况下,baCls保存什么?编译器输出是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-17 14:37:32

在这两种情况下,baCls都是对类BankAccount的引用。

泛型添加编译时检查,但在运行时没有影响。

如果在IDE中使用javap -c -p或字节代码查看器,您可以看到生成的字节码。

票数 4
EN

Stack Overflow用户

发布于 2016-04-17 20:44:24

Peter的回答解决了您的具体问题,但我认为它忽略了一个重要的事实,即第二个案例为编译器提供了更多的、非常宝贵的信息。

区别在于,第一种情况是原始类型。

代码语言:javascript
复制
Class baCls = BankAccount.class;
     ^ Missing type parameters.

这有(至少)两种后果(这是使用原始类型的一般后果):

  1. 如果没有强制转换,就不能调用生产者方法(如Class.nextInstance()方法)并将结果分配给BankAccount类型的引用: 类baCls = BankAccount.class;BankAccount实例= (BankAccount) baCls.newInstance(/*必需的args */); 但是,在第二种情况下不需要强制转换,因为众所周知,nextInstance方法将返回BankAccount的一个实例: 类baClsSafe = BankAccount.class;BankAccount实例= baCls.newInstance(/* req */);
  2. 如果将这些放入集合中,则会丢失类型安全性。例如: 类baCls = BankAccount.class;List list =新ArrayList<>();list.add(baCls);//编译良好。 这看起来很好,但是如果假设列表中的元素是正确的类型,则稍后会得到一个运行时异常: 用于(类clazz : list) {clazz.newInstance= clazz.newInstance();// ClassCastException。} 因为instance实际上是BankAccount的一个实例(假设它有一个零args构造函数)。 在第二种情况下,您将永远无法将此项添加到列表中: 类baCls = BankAccount.class;List list =新的ArrayList<>();list.add(baCls);//编译器错误。

我建议您阅读有关原始类型的内容,例如在泛型教程中,以及在有效的Java2ED项目23中,“不要在新代码中使用原始类型”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36677898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档