2014-02-10 3 views
0

Рассмотрим следующие два класса:искореженных Вложенный класс namein Спецификация языка Java-

// a.java 
public class a 
{ 
    public static class $b 
    { 

    } 
} 


// a$.java 
public class a$ 
{ 
    public static class b 
    { 

    } 
} 

Очевидно, что из-за внутренней/вложенное имя класса коверкая, в $ .b и а. $ b будет скомпилирован в файл класса с именем $$ b.class. Когда команда javac a.java a$.java выполняется, Oracle Java компилятор (Javac 1.7.0_45) производит следующий вывод:

a$.java:3: error: duplicate class: a.$b 
    public static class b 
       ^
1 error 

Где это сказать в спецификации языка Java, что эти имена классов (a$.b и a.$b) столкновение, или это просто установленное соглашение из-за выходных файлов с таким же именем?

+0

Я предполагаю, что это говорит, что это в какой-либо части сделки JLS с именем коверкая внутренних классов и, таким образом, определяет, что поведение. Не имея копии JLS, это просто догадка. – keshlam

+1

@keshlam У каждого есть копия JLS, если у них есть интернет;) –

+0

@BrianRoach Не все должны читать его по юридическим причинам. Мне нужно быть немного более осторожным, чем некоторые. – keshlam

ответ

2

6.1, который указывает на 3.8, который говорит:

Идентификатор представляет собой последовательность неограниченной длины Java букв и цифр Java, первая из которых должна быть буква Java.

...

The "Java буквы" включают в себя прописными и строчными буквами ASCII латинские буквы AZ (\ u0041- \ u005a), и аз (\ u0061- \ u007a), и, по историческим причинам, ASCII подчеркивание (_, или \ u005f) и знак доллара ($, или \ u0024). Символ $ следует использовать только в механически сгенерированном исходном коде или, реже, для доступа к уже существующим именам в унаследованных системах.

(курсив мой)

Хотя на самом деле, это просто вопрос вы имеющий имя дубликат класса после генерации байт-кода. Такая же ошибка возникла бы с двумя сталкивающимися именами классов, которые не включали $ в источник.

Изменить, чтобы добавить: двоичный формат задается в 13.1

+0

Я думаю, что 13.1 - это часть, за которой я пришел - она ​​точно описывает, каким будет двоичное имя класса. Я бы ожидал, что там будет предостережение о том, что двоичные имена не могут столкнуться, но, возможно, слишком очевидно, что нужно тратить время на то, чтобы прописать это в спецификации. – studro

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