首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java标识符解析规则

Java标识符解析规则
EN

Stack Overflow用户
提问于 2009-12-30 10:19:01
回答 2查看 488关注 0票数 3

Java编译器使用什么搜索顺序来解析下面类中的Foo

代码语言:javascript
复制
class Test
{
  Foo f;
}

经验检验显示了以下搜索顺序:

  1. 嵌套类
  2. 超类嵌套类
  3. *类
  4. 其他?

但是我想知道在Java语言规范中讨论这个问题的地方。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-12-30 11:20:04

我不认为在你所说的意义上有搜索顺序。相反,我认为这条规则适用于:

6.5.5类型名称的含义分类为TypeName的名称的含义如下。 6.5.5.1简单类型名称--如果类型名称由单个标识符组成,则标识符必须出现在具有此名称的类型的一个可见声明的范围内,否则将发生编译时错误。类型名称的含义是该类型。

在这种情况下,导入算作声明;参见JLS 6.1。然而,复杂的因素是隐藏规则(JLS6.3.1),其中指出某些类型的声明(在这种情况下)隐藏了现有的声明,而另一些则不隐藏,具体来说,“按需导入”(例如import java.util.*;java.lang.*的隐式导入)不会隐藏其他声明。

因此,例如;

代码语言:javascript
复制
package foo;

import java.sql.Date;
import java.util.*;  // import on demand: java.util.Date does not shadow java.sql.Date
import java.awt.*;  // import on demand: java.awt.List does not shadow java.util.List

class Integer { // (foo.)Integer shadows java.lang.Integer
    ...

    static class Integer { // (foo.Integer.)Integer shadows foo.Integer.
        ...

        List t = ... // Compilation error, because there are currently two visible 
                     // declarations of List (JLS 6.5.5.1)
    }
}

另一个缺点是,“单类型导入”(如上面的import java.sql.Date; )遮挡了在同一个包中声明的类型,以及按需导入的类型,但它并不隐藏通过另一个“单类型导入”(JLS6.3.1)导入的其他类型。因此,例如,以下是编译错误:

代码语言:javascript
复制
import java.sql.Date;
import java.util.Date;  // Compilation error
票数 3
EN

Stack Overflow用户

发布于 2009-12-30 10:27:32

它应该遵循与局部变量声明的范围中显示的不同作用域相同的顺序。

编辑:我指向JVM规范的链接指的是执行阶段,而不是OP 吉里注释的编译阶段。

因为这不是一个完整的答案,我把它留在这里作为CW开始线程。

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

https://stackoverflow.com/questions/1979428

复制
相关文章

相似问题

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