我有一个基本的java问题,因为我最近决定深入研究这个语言(我已经专门使用C++很长时间了,并且决定扩大我的视野)。
假设我有一个名为BankAccount的类,并且我尝试在主目录中创建和对象,那么在以下几个方面之间有什么区别:
Class baCls = BankAccount.class; 和
Class<BankAccount> baCls = BankAccount.class;在每一种情况下,baCls保存什么?编译器输出是什么?
发布于 2016-04-17 14:37:32
在这两种情况下,baCls都是对类BankAccount的引用。
泛型添加编译时检查,但在运行时没有影响。
如果在IDE中使用javap -c -p或字节代码查看器,您可以看到生成的字节码。
发布于 2016-04-17 20:44:24
Peter的回答解决了您的具体问题,但我认为它忽略了一个重要的事实,即第二个案例为编译器提供了更多的、非常宝贵的信息。
区别在于,第一种情况是原始类型。
Class baCls = BankAccount.class;
^ Missing type parameters.这有(至少)两种后果(这是使用原始类型的一般后果):
Class.nextInstance()方法)并将结果分配给BankAccount类型的引用:
类baCls = BankAccount.class;BankAccount实例= (BankAccount) baCls.newInstance(/*必需的args */);
但是,在第二种情况下不需要强制转换,因为众所周知,nextInstance方法将返回BankAccount的一个实例:
类baClsSafe = BankAccount.class;BankAccount实例= baCls.newInstance(/* req */);instance实际上是BankAccount的一个实例(假设它有一个零args构造函数)。
在第二种情况下,您将永远无法将此项添加到列表中:
类baCls = BankAccount.class;List list =新的ArrayList<>();list.add(baCls);//编译器错误。我建议您阅读有关原始类型的内容,例如在泛型教程中,以及在有效的Java2ED项目23中,“不要在新代码中使用原始类型”。
https://stackoverflow.com/questions/36677898
复制相似问题