2009-12-30 4 views
3

Какой порядок поиска использует компилятор Java для разрешения Foo в следующем классе?Правила разрешения идентификатора Java

class Test 
{ 
    Foo f; 
} 

Эмпирические тесты показывают следующий порядок поиска:.

  1. Вложенные классы
  2. Superclass Вложенные классы
  3. java.lang * Классы
  4. другие?

, но я хотел бы знать, где это обсуждается в Java Language Specification.

ответ

3

Я не думаю, что есть порядок поиска в том смысле, который вы имеете в виду. Скорее, я считаю, что это правило применяется:

6.5.5 Meaning of Type Names The meaning of a name classified as a TypeName is determined as follows.

6.5.5.1 Simple Type Names If a type name consists of a single Identifier, then the identifier must occur in the scope of exactly one visible declaration of a type with this name, or a compile-time error occurs. The meaning of the type name is that type.

В этом контексте импорт считается декларацией; см. JLS 6.1. Однако усложняющим фактором являются правила Shadowing (JLS 6.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; выше) тени типов, объявленных в том же пакете, и типов импортируемых по требованию, но это не тени других типов, импортированных с помощью другого " однотипный импорт "(JLS 6.3.1). Так, например, следующая ошибка компиляции:

import java.sql.Date; 
import java.util.Date; // Compilation error 
+0

Отличный ответ. Спасибо! – Gili

2

Он должен следовать тому же порядку, что и различные области, представленные в Scope of Local Variable Declarations.

Edit: моя ссылка на JVM спецификации, отнесенным к фазе выполнения, а не фаза компиляции, а прокомментирован OP Gili

Поскольку это не полный ответ, я оставляю его здесь, как CW, чтобы начать нить.

+0

-1, ваша ссылка «Наследование класса из Представления класса File» связана с разрешением нагрузки времени когда классы уже были собраны. Я прошу, как компилятор разрешает идентификаторы для начала. Ваша ссылка на «Область локальной декларации переменных» указывает на неправильный раздел и в любом случае не обсуждает порядок разрешения. – Gili

Смежные вопросы