Почему классы компилируются в .class, а интерфейс не в .interface - PullRequest
10 голосов
/ 10 февраля 2010

Существует ли какая-либо конкретная причина, по которой интерфейсы не компилируются в MyInterface.java, скомпилированный в файл .interface? Но любой класс компилируется в файл .class.!

Ответы [ 6 ]

14 голосов
/ 10 февраля 2010

Поскольку смысл в том, чтобы указать, что файл байт-код Java (и .class был выбранным расширением для этого), а не конкретная языковая конструкция.

6 голосов
/ 10 февраля 2010

Представление физического байт-кода в файловой системе не имеет значения.

Это логическая реализация (класс или интерфейс) имеет значение.

5 голосов
/ 10 февраля 2010

Java рассматривает интерфейсы почти как классы, например, они используют одно и то же пространство имен (у вас не может быть интерфейса с тем же именем, что и у класса), а скомпилированный интерфейс почти идентичен скомпилированному абстрактному классу.

Так что не имеет смысла хранить их в другом формате или с другим расширением файла. Наоборот, это усложнит многие вещи. Например, когда вы загружаете класс или интерфейс по имени (Class.forName ("my.class.name")), Java не знает, является ли он классом или интерфейсом. Если будет два разных расширения, Java будет пытаться найти файл «my / class / name.class», а затем «my / class / name.interface», вместо того, чтобы пробовать только первое.

4 голосов
/ 10 февраля 2010

Так решили дизайнеры языка.

Это имеет смысл несколькими способами:

  • .class - это побочный продукт, который вы обычно не видите и не манипулируете вручную.
  • Чем меньше разных расширений использует программа, тем проще ее поддерживать.
  • Во многих случаях в коде нет различия между классом и интерфейсом, поэтому логично, что двоичные файлы выглядят одинаково.

Честно говоря, я не могу придумать вескую причину иметь разные расширения для скомпилированных классов и интерфейсов. Почему так важно различать их?

3 голосов
/ 10 февраля 2010

В java у вас есть исходные файлы с именем .java и двоичные файлы с именем .class. Это просто выбор имен.

Также для классов Java и интерфейсов они не сильно отличаются (класс просто содержит много дополнительной информации, такой как тела методов).

1 голос
/ 10 февраля 2010

Это просто выбор, который они сделали. Я бы не стал беспокоиться об этом. В любом случае это двоичный файл. Один из способов думать: «Даже если это интерфейс, он все еще находится в файле .java».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...