В чем разница между интерфейсом и @interface в Java?

306

Я не прикасался к Java с тех пор, как в конце 90-х годов в университете использовал JBuilder, поэтому я немного не в курсе - во всяком случае, на этой неделе я работал над небольшим Java-проектом и использовал Intellij IDEA в качестве своей IDE , для изменения темпа от моей обычной разработки .Net.

Я заметил, что он поддерживает добавление интерфейсов и @interfaces, что такое @interface и чем он отличается от обычного интерфейса?

public interface Test {
}

против

public @interface Test {
}

Я провел небольшой поиск, но не смог найти много полезной информации, относящейся к @interface.

Bittercoder
источник

Ответы:

322

Символ @ обозначает определение типа аннотации.

Это означает , что это не на самом деле интерфейс, а новый тип аннотации - для использования в качестве модификатора функции, такие как @Override .

Смотрите эту запись Javadocs на эту тему.

mrkishi
источник
7
Большое спасибо, приятно знать. Так каково было обоснование для того, чтобы называть это @interface, вместо того, чтобы говорить @annotation, мне интересно .. кажется ненужным перегруженным термином.
горький кодер
5
Учебник и JLS ссылаются на аннотацию, представляющую собой особый вид интерфейса. Похоже, что нет большого обсуждения этой темы, но javarunner.blogspot.com/2005/01/annotations-in-java-15.html объясняет, что аннотации являются неявным расширением интерфейса Annotation, а также @ и интерфейса. используются, чтобы вместе отличать от обычного интерфейса. Вы также можете прочитать спецификацию JSR для аннотаций.
DavidValeri
1
@Bittercoder, упомянутые в документах: «интерфейсу ключевого слова предшествует знак at (@) (@ = AT, как в типе аннотации)». Вот и все обоснование, которое я могу найти в названии.
Shaishav
112

интерфейс:

В целом, интерфейс предоставляет контракт без предоставления основных деталей реализации. В объектно-ориентированном программировании интерфейсы определяют абстрактные типы, которые демонстрируют поведение, но не содержат логику. Реализация определяется классом или типом, который реализует интерфейс.

@interface: (тип аннотации)

Возьмите приведенный ниже пример, который имеет много комментариев:

public class Generation3List extends Generation2List {

   // Author: John Doe
   // Date: 3/17/2002
   // Current revision: 6
   // Last modified: 4/12/2004
   // By: Jane Doe
   // Reviewers: Alice, Bill, Cindy

   // class code goes here

}

Вместо этого вы можете объявить тип аннотации

 @interface ClassPreamble {
   String author();
   String date();
   int currentRevision() default 1;
   String lastModified() default "N/A";
   String lastModifiedBy() default "N/A";
   // Note use of array
   String[] reviewers();
}

который может затем аннотировать класс следующим образом:

@ClassPreamble (
   author = "John Doe",
   date = "3/17/2002",
   currentRevision = 6,
   lastModified = "4/12/2004",
   lastModifiedBy = "Jane Doe",
   // Note array notation
   reviewers = {"Alice", "Bob", "Cindy"}
)
public class Generation3List extends Generation2List {

// class code goes here

}

PS: Многие аннотации заменяют комментарии в коде.

Ссылка: http://docs.oracle.com/javase/tutorial/java/annotations/declaring.html

певчий дрозд
источник
11
хорошее объяснение
Пэт Б
2
Это было на самом деле полезно. Я не знал, что Java может сделать это.
Джей Сидри
Предыдущий ответ включал эту ссылку, откуда появилась эта информация. Я нашел полезным найти больше информации по этой теме. docs.oracle.com/javase/tutorial/java/annotations/declaring.html
PatS
1
Один из лучших и полных ответов (пока не ясно), который я наблюдал за stackoverflow.
Мистер Д
32

interfaceКлючевое слово указывает на то, что вы объявляете традиционный класс интерфейса в Java.
@interfaceКлючевое слово используется для объявления нового типа аннотаций.

См. Учебник docs.oracle по аннотациям для описания синтаксиса.
Посмотрите JLS, если вы действительно хотите вникнуть в детали того, что @interfaceзначит.

DavidValeri
источник
18

interface: определяет контракт для класса, который его реализует

@interface: определяет контракт для аннотации

Эммануэль Осимосу
источник
8

Интерфейс в языке программирования Java - это абстрактный тип, который используется для определения поведения, которое должны реализовывать классы. Они похожи на протоколы. Интерфейсы объявляются с использованием ключевого слова interface

@interface используется для создания ваших собственных (пользовательских) аннотаций Java. Аннотации определяются в своем собственном файле, как класс или интерфейс Java. Вот пользовательский пример аннотации Java:

@interface MyAnnotation {

    String   value();

    String   name();
    int      age();
    String[] newNames();

}

В этом примере определяется аннотация MyAnnotation, которая имеет четыре элемента. Обратите внимание на ключевое слово @interface. Это сигнализирует компилятору Java, что это определение аннотации Java.

Обратите внимание, что каждый элемент определяется аналогично определению метода в интерфейсе. У него есть тип данных и имя. Вы можете использовать все примитивные типы данных в качестве типов данных элемента. Вы также можете использовать массивы в качестве типа данных. Вы не можете использовать сложные объекты в качестве типа данных.

Чтобы использовать вышеупомянутую аннотацию, вы можете использовать код, подобный следующему:

@MyAnnotation(
    value="123",
    name="Jakob",
    age=37,
    newNames={"Jenkov", "Peterson"}
)
public class MyClass {


}

Ссылка - http://tutorials.jenkov.com/java/annotations.html

Пиюш Сингх
источник