当前位置: 首页 > 面试题库 >

如何找出Java中标识符的声明类型?

云远
2023-03-14
问题内容

我有一个简单的类Apple从另一个简单的类Fruit继承而来。

在运行时,我可以使用

Fruit fruit = new Apple();

fruit.getClass();

获取水果对象的实际类型,即Apple.class。

我还可以使用fruit instanceof Apple,并fruit instanceof Fruit验证该水果对象是否是Apple或Fruit的实例。这两个表达式都返回true,这是正常的。

但是,有没有一种方法可以精确地确定声明的fruit标识符类型?在这种情况下是哪个Fruit


问题答案:

您实际上是在问有关变量声明的问题,fruit而不是对象的实际运行时类型(Apple在这种情况下为)。

我认为这通常是一个坏主意:您只是声明了变量,并告诉编译器它为a Fruit,那么为什么现在需要找出这个变量?

只是要使事情更加混乱,值得注意的是,您还可以具有多个具有不同声明类型的变量来引用同一对象(仍然是Apple):

Fruit fruit = new Apple(); // fruit declared as Fruit, but refers to an Apple
Object thing = fruit;      // thing declared as Object, refers to the same Apple

如果您真的想找出已声明的类型,则可以选择以下几种方法:

  • 创建fruit一个实例变量,并使用反射查询声明的类型。
  • 对源代码进行一些处理以找到变量声明
  • 对已编译的字节码进行一些处理以找到声明类型(尽管有可能激进的编译器甚至可以完全优化编译时间声明,例如,在意识到该代码中的结果只能是苹果之后)

我认为所有这些都很难看,所以我的一般建议是“不要这样做”。



 类似资料:
  • 我使用Identityserver3作为MVC应用程序的授权服务器。因此,我的类如下: 这是我的子类: 这是我的: 但是在我的

  • 我还在尝试将我的应用程序从WSO2IS-5.2.0迁移到WSOIS-5.3.0。我的应用程序是一个管理用户的rest api,我称之为wso2is soap WebServices。 在5.3.0中,我似乎不能用webservice修改identity/AccountLocked或identity/FailedLoginAttempts等标识声明 tid:1[2017-01-19 10:42:26

  • 我正在分析ASTNodes(org.eclipse.jdt.core.dom),并试图找到我拥有的变量节点(SimpleName)的VariableDeclaration。示例: 我还需要一个解决方案,可以找到声明,如果它是一个类字段。

  • 我正在调试一个非常大的树着色项目,在该项目中,作者使用glsl文件来着色树,但我在编译glsl文件时遇到了麻烦: 以下是错误日志: 我使用mac osx,Xcode7.0,OpenGL和glut都是默认版本。Glew版本是1.13.0。 这是因为版本与作者使用的原始版本不匹配吗?因为我检查了原始版本,所以他使用了GLEW 1.9.0和GLUT 3.7.6。 //////更新/////// 原来ma

  • 我正在使用SODA for Java存储和检索Oracle12c DB中的文档。我正在效仿这个例子。 这一例外背后的原因将是什么?