В чем разница между интерфейсом и @interface в Java? - PullRequest
258 голосов
/ 28 мая 2009

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

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

public interface Test {
}

против

public @interface Test {
}

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

Ответы [ 5 ]

279 голосов
/ 28 мая 2009

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

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

См. запись javadocs по теме.

93 голосов
/ 19 февраля 2014

Интерфейс:

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

@ интерфейс: (Тип аннотации)

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

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

31 голосов
/ 28 мая 2009

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

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

15 голосов
/ 05 сентября 2017

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

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

2 голосов
/ 15 февраля 2019

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

...