인터페이스의 메소드 구현을 @Override해야합니까?


432

인터페이스 메소드를 구현하는 메소드에 주석을 달아야 @Override합니까?

주석javadoc은 다음과 같이Override 말합니다.

메소드 선언이 수퍼 클래스에서 메소드 선언을 대체하도록되어 있음을 나타냅니다. 이 어노테이션 유형으로 메소드에 주석이 달렸지만 수퍼 클래스 메소드를 대체하지 않는 경우, 컴파일러는 오류 메시지를 생성해야합니다.

인터페이스가 기술적으로 수퍼 클래스라고 생각하지 않습니다. 아니면?

Question Elaboration


5
와우이 질문은 더 짧을 수 있지만, 내가 필요한 질문입니다. 감사합니다
Dan Rosenstark 2:25에

1
@Override 기사를 대체 할 수 없습니다 (오라클은 최근에 기존 Sun 블로그를 이전했습니다). 그것을 찾는 방법을 알고 있습니까?
도마뱀 빌

4
지금까지는 2015 년까지 @Implement (s) 주석이 있어야합니다. 그렇게하면 상황이 명확 해집니다!
Alex

3
지금까지 (2015) java 8에서 @Override를 사용해야합니까?
Lorenzo Sciuto

답변:


305

가능하면 @Override를 사용해야합니다. 간단한 실수를 방지합니다. 예:

class C {
    @Override
    public boolean equals(SomeClass obj){
        // code ...
    }
}

제대로 재정의하지 않기 때문에 컴파일되지 않습니다 public boolean equals(Object obj).

인터페이스 ( 1.6 이상 만 ) 를 구현 하거나 Super 클래스의 메서드를 재정의하는 메서드도 마찬가지입니다 .


150
Java 5에서 인터페이스를 구현하는 메소드에는 @Override 어노테이션을 추가 할 수 없습니다 . 오류가 발생합니다. Java 6에서 허용됩니다.
Bill Michell

17
아뇨. 실제로 Eclipse는 인터페이스를 구현하는 메소드를 채울 때 @Override를 자동 삽입합니다.
jjnguy

14
인터페이스 메소드 구현과 관련하여 Java 1.5에서 1.6까지의 다른 동작에 대한 언급이있을 때까지 -1. 내가 사람들에게 혼란스러운 측면을 보았 기 때문에 실제로 언급 할 가치가 있습니다.
Grundlefleck

2
이클립스가 불평하는 경우 ur jdk를> 1.5로 업그레이드하고 컴파일러 준수 수준을 1.6 또는 1.7로 변경하십시오. 그렇게하려면 ur 프로젝트-> 속성-> Java 컴파일러를 마우스 오른쪽 버튼으로 클릭하고 1.5보다 높은 것을 선택하십시오.
로즈

1
누구나 대답을 실제로 정당화하는 예제를 생각할 수 있습니까 (기본 방법을 재정의하는 대신 인터페이스 구현)? 나에게 큰 장점은 독자가 특정 방법을 어떻게, 어떻게 사용할 지에 대한 독자의 기대치를 설정한다는 점이다.
Joe Lee-Moyet

103

나는 javac 행동이 변했다고 믿습니다-1.5는 주석을 금지하고 1.6은 그렇지 않습니다. 주석은 추가 컴파일 타임 검사를 제공하므로 1.6을 사용하는 경우 계속 사용하십시오.


1
추가 점검은 무엇입니까?
Michael Carman

17
@Michael 인터페이스가 삭제되었는지 확인할 수 있습니다.
Sanghyun Lee

68

@Override사용 가능한 경우 항상 메소드에 주석을 달아야 합니다.

JDK 5에서 이는 수퍼 클래스의 메소드를 대체 함을 의미하고 JDK 6 및 7에서 수퍼 클래스의 메소드를 대체하고 인터페이스의 메소드를 구현하는 것을 의미합니다. 앞에서 언급했듯이 그 이유는 컴파일러가 메서드를 재정의 (또는 구현)하고 있다고 생각하지만 실제로 새 메서드 (서명)를 정의하고 있다고 판단되는 경우 오류를 포착 할 수 있기 때문입니다.

equals(Object)비교의 equals(YourObject)예는 점에서, 표준의 경우이지만, 동일한 인수는 인터페이스 구현을 위해 제조 될 수있다.

인터페이스의 구현 메소드에 주석을 달지 않아도되는 이유는 JDK 5가 이것을 컴파일 오류로 표시했기 때문이라고 생각합니다. JDK 6에서이 주석을 필수로 설정하면 이전 버전과의 호환성이 손상됩니다.

Eclipse 사용자는 아니지만 다른 IDE (IntelliJ)에서는 @Override프로젝트가 JDK 6+ 프로젝트로 설정된 경우 인터페이스 메소드를 구현할 때만 주석이 추가됩니다. 나는 이클립스가 비슷하다고 상상할 것이다.

그러나이 사용법에 대해 다른 주석, 아마도 주석을 선호합니다 @Implements.



11

JDK 5.0에서는 @Override인터페이스에 선언 된 메소드 (컴파일 오류)를 구현하는 경우 주석 을 사용할 수 없지만 JDK 6.0에서는 주석 을 사용할 수 있습니다. 따라서 요구 사항에 따라 프로젝트 환경 설정을 구성 할 수 있습니다.


4

경우 구체적인 클래스가되지 오버라이드 (override) 추상적 인 방법을 사용 @Override하기위한 구현하는 것은 컴파일러가 변함없이 어떤 구현되지 않은 방법을 경고하기 때문에 개방 문제입니다. 이러한 경우 가독성을 떨어 뜨린다는 주장을 할 수 있습니다. 코드에서 읽는 것이 더 많으며, 덜 호출되는 @Override것은 아닙니다 @Implement.


3

자신의 클래스에서 상속받은 자신의 메서드를 재정의하면 일반적으로 ide를 사용하여 리팩토링을 중단하지 않습니다. 그러나 라이브러리에서 상속 된 메소드를 대체하는 경우이를 사용하는 것이 좋습니다. 그렇지 않으면 나중에 라이브러리를 변경해도 오류가 발생하지 않지만 숨겨진 버그가 발생합니다.


3

JDK에는 문제가 없습니다. Eclipse Helios에서는 구현 된 인터페이스 메소드 (JDK 5 또는 6)에 @Override 어노테이션을 허용합니다. Eclipse Galileo의 경우 @Override 어노테이션은 JDK 5 또는 6에 관계없이 허용되지 않습니다.


2

저에게는 종종 이것이 일부 코드에서 Java 6을 컴파일해야하는 유일한 이유입니다. 그만한 가치가 있는지 확실하지 않습니다.


2

java8에서 javadoc을 읽으면 인터페이스 대체 선언에서 다음을 찾을 수 있습니다.

이 어노테이션 유형으로 메소드에 어노테이션이있는 경우 다음 조건 중 하나 이상이 충족되지 않으면 컴파일러가 오류 메시지를 생성해야합니다.

  • 이 메소드는 수퍼 타입에 선언 된 메소드를 대체하거나 구현합니다.
  • 이 메소드에는 {@linkplain Object}에 선언 된 모든 공개 메소드의 서명과 대체되는 서명이 있습니다.

따라서 적어도 java8에서는 인터페이스 메소드 구현에서 @Override를 사용해야합니다.


1

Eclipse 자체는 @Override인터페이스를 구현하는 클래스를 작성하는 동안 "구현되지 않은 메소드 생성"을 지시 할 때 주석 을 추가합니다 .


1

를 포함하는 문제 @Overridesuper.theOverridenMethod()메소드 를 호출하는 것을 잊어 버렸다고 생각하게한다는 것입니다 . 매우 혼란 스럽습니다 . 이것은 분명해야합니다. 아마도 여기에 Java를 제공해야 할 @Interface것입니다. 아, 또 반쯤 자바 특유의 또 다른 특징은 ...


3
인터페이스를 구현하지 않을 때 슈퍼를 호출하는 것은 항상 필요하거나 원하지 않는 일이 아닙니다. 때로는 기능을 추가하기도합니다. 다른 경우에는 기능을 교체하고 있으므로 호출하지 않습니다. API 작성자는 내부 기능에 의존하는지 여부를 문서화하고 클래스를 올바르게 확장하는 방법에 대한 문서화 된 계약을 작성해야합니다.
lilbyrdie 2016 년

1

Java 6 이상 버전에서는 @Override인터페이스를 구현하는 메소드에 사용할 수 있습니다 .

그러나 나는 그것이 의미가 있다고 생각하지 않습니다 : override는 수퍼 클래스에서 메소드를 hava하고 하위 클래스에서 메소드를 구현하고 있음을 의미합니다.

인터페이스를 구현하는 @Implement중이 라면 우리는 또는 다른 것을 사용해야 하지만 @Override.


0

인터페이스의 경우 @Override를 사용하면 컴파일 오류가 발생했습니다. 그래서 제거해야했습니다.

오류 메시지가 " The method getAllProducts() of type InMemoryProductRepository must override a superclass method"로 이동했습니다.

" One quick fix available: Remove @Override annotation." 도 읽습니다

Eclipse 4.6.3, JDK 1.8.0_144에있었습니다.


0

를 구현 interface하는 abstract클래스 @Override가 클래스 인 경우 구현이 interface메소드에 대한 것인지 확인하는 데 유용합니다 . 를 빼고 클래스는 단지 방법과 일치하지 않는 구현 방법 서명이 선언해도 잘 컴파일 할 것이다 ; 일치하지 않는 방법은 구현되지 않은 상태로 유지됩니다. @Zhao가 인용 한 Java 문서@Overrideabstractinterfaceinterface

이 메소드는 슈퍼 타입으로 선언 된 메소드를 대체하거나 구현합니다.

명확하게 abstract슈퍼 클래스 . 는 interface수퍼 타입이라고 할 수 없습니다. 따라서 @Override중복적이고 interface구체적인 클래스의 메소드 구현에는 적합하지 않습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.