2009-05-27 5 views
187

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

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

public interface Test { 
} 

против

public @interface Test { 
} 

Я сделал немного поиска, но не смог найти много полезной информации со ссылкой на @interface.

ответ

198

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

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

См. Это javadocs entry по этому вопросу.

+5

Большое спасибо, хорошо, чтобы знать. Итак, что было основанием для того, чтобы называть его @interface, а затем сказать @annotation, мне интересно .. кажется излишне перегруженным термином. – Bittercoder

+4

Учебник и JLS ссылаются на аннотацию, являющуюся особым видом интерфейса. Там, кажется, не так много обсуждений по этому вопросу, но http://javarunner.blogspot.com/2005/01/annotations-in-java-15.html объясняет, что аннотации являются неявным расширением интерфейса аннотации и @ и интерфейс используются вместе, чтобы отличить от обычного интерфейса. Вы также можете прочитать спецификацию JSR для аннотаций. – DavidValeri

+0

@Bittercoder в документах упоминается: «Интерфейсу ключевого слова предшествует знак at (@) (@ = AT, как в типе аннотации)». Это все обоснование, которое я могу найти w.r.t. именование. – Shaishav

25

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

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

67

интерфейс:

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

@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

+5

приятное объяснение –

+1

Это было действительно полезно. Я не знал, что Java может это сделать. –

+0

Это должен быть принятый ответ. – instinct

5

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

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

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