考虑下面的代码:为什么你可以导入一个与嵌套类名称相同的类?
import java.util.Calendar;
class Demo
{
class Calendar {}
public static void main (String[] args) {
// System.out.println(Calendar.DAY_OF_WEEK); // Would be an error.
}
}
此代码编译的罚款;但如果你是指Calendar
内Demo
,你是指Demo.Calendar
,不java.util.Calendar
。
导入显然是多余的;但似乎奇怪的是,它是允许的,考虑到你不能用相同的简单名称导入一个类,如在同一编译单元中定义(每JLS Sec 7.5.1)一个顶级类:
import java.util.Calendar; // error: Calendar is already defined in this compilation unit
class Calendar {}
有为什么像第一个代码示例中那样导入的实际原因不会是编译时错误?
这不是多余的;这是无效的。据说,我很确定这是合法的,因为语言规范并不禁止它。可能这是语言设计者没有考虑的情况。 – davmac
你误读了JLS。它不禁止导入与顶级类相同的名称,如果“编译单元还声明了简单名为'n'的顶级[sic]类型”,则禁止导入名称'n'。这不是你展示的情况。 –
@LewBloch我不明白你指出的区别。请你能举一个例子来证明这个区别吗? –