考慮下面的代碼:爲什麼你可以導入一個與嵌套類名稱相同的類?
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我不明白你指出的區別。請你能舉一個例子來證明這個區別嗎? –