Java编译器使用什么搜索顺序来解析下面类中的Foo?
class Test
{
Foo f;
}经验检验显示了以下搜索顺序:
但是我想知道在Java语言规范中讨论这个问题的地方。
发布于 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.*的隐式导入)不会隐藏其他声明。
因此,例如;
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)导入的其他类型。因此,例如,以下是编译错误:
import java.sql.Date;
import java.util.Date; // Compilation error发布于 2009-12-30 10:27:32
https://stackoverflow.com/questions/1979428
复制相似问题