2010-02-25 3 views
50

인터페이스의 메소드를 구현할 때 Eclipse에서 @Override 어노테이션을 추가하고 있습니다. 이클립스는 이것에 아무런 문제가없는 것 같다. 그리고 Cruise Control의 자동 빌드 프로세스에는 아무런 문제가없는 것으로 보입니다. 그러나 javac를 실행하는 ant를 사용하여 명령 줄에서 빌드하면 다음 오류가 발생합니다.javac가 @Override 어노테이션에서 실패하는 이유

[javac] C:\path\project\src\com\us\MyClass.java:70: method does not override a method from its superclass 
[javac]  @Override 
[javac] ^
[javac] 1 error 

Eclipse는 Java 1.6에서 실행됩니다. Cruise Control은 Java 1.5를 실행 중입니다. 내 개미 빌드는 내가 사용하는 자바 버전에 관계없이 실패합니다.

답변

99

@Override 주석 사양이 Java 1.6에서 변경되었습니다. 자바 1.5에서는 컴파일러가 구현 된 인터페이스 메소드에서 @Override 주석을 허용하지 않았지만 1.6에서는 컴파일러가 @Override 주석을 허용하지 않았습니다. 내가 찾은 첫 번째 검색 결과는 blog post here.입니다. 그것 was not well documented,하지만 그것은 바뀌었다.

이클립스가 1.6을 준수하도록 설정 되었기 때문에 이클립스가 이클립스를 추가하고있다. 같은 자바 버전에서 빌드 및 이클립스 환경을 유지해야한다. 나에게 명확한 Cruise Control이 별도의 JDK6을 사용하여 컴파일하는지 여부에 관계없이 Java 5를 실행하고 있는지 여부는 명확하지 않습니다.

1.5 대 1.6 오버라이드 주석 규칙과는 별도로 Eclipse에는 javac이 아닌 고유 한 컴파일러 구현이 있으며 때때로 다른 동작이 있음을 기억하십시오. Eclipse에서 컴파일 할 때마다 Ant 나 Maven이 컴파일되지 않을 때마다 컴파일러를 행복하게 만드는 방법을 찾아야합니다.

Here's a screenshot of changing the compiler in eclipse

+6

이것은 훌륭한 대답입니다. 내가 추가해야 할 것이 하나 있습니다 : 당신이 JDK 1.5에 머무르고 자하는 이유가 무엇이든 최신 업데이트 릴리스로 업그레이드하면됩니다. 저는 u21을 사용하고 있습니다.이 유형의 @Overrides는 정상적으로 컴파일됩니다. –

+1

쿨 - 내 답변에 추가하겠습니다. –

+6

JDK 1.5u21과 1.5u22를 모두 설치했으며 javac에서는 두 릴리스에서 인터페이스 메소드 구현시 @Override를 허용하지 않습니다. 다음은 는 MyRunnable는 java.lang.Runnable의 구현 : C : /Java/jdk/1.5.0_21/bin/javac MyRunnable.java MyRunnable.java:3 : 방법은 슈퍼 클래스 @Override에서 메소드를 오버라이드 (override)하지 않는 public void run() {} ^ 1 오류 [릴리스 정보] (http://java.sun.com/j2se/1.5.0/ReleaseNotes.html)에도 언급되어 있지 않습니다. – djb

16

난 정말 당신이보고있는 문제를 설명 할 수 있지만 JDK 5 만에 존재 재정의 방법에, 만일 인터페이스의 구현 방법에 @Override을 허용하지 않습니다는 사실과 관련이있을 것으로 보인다 수퍼 클래스.

JDK 6@Override을 허용합니다.

개미 빌드가 실패하면 source 매개 변수를 javac에 전달하여 JDK 5 규격을 요구할 수 있습니다.

3

구현 된 메소드의 @Override 태그는 Java 1.6에서 새로 추가되었습니다. Java 1.5에서 @Override는 기본 클래스의 메서드를 재정의 할 때만 정확합니다. 더 읽기 herehere.

0

이클립스는 자바보다는 1.5의 1.6 버전을 가리키는 것입니다. 이클립스에서 java 버전을 구성하기위한 See here

3

@Override이 메소드 구현의 맥락에서 사용할 때 오류가 javac의에 의해 발생 "왜"라는 질문에 직접 대답은 자바 사양에서 실제로 :

"The rationale for this is that a concrete class that implements an interface will necessarily override all the interface's methods irrespective of the @Override annotation, and so it would be confusing to have the semantics of this annotation interact with the rules for implementing interfaces."

http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.6.1.4

보기

그러나 분명히 누군가가 자바 1.6와 1.5 U21에 대한 자신의 마음을 바꾸 ...

0

해당 인터페이스의 정의가 하나만 있는지 확인하십시오.

예 : HttpServletRequest의

이 다른 스펙 제공에 따라와의 인터페이스이다.

pax-web-jetty와 apache-felix-jetty를 비교해보십시오. 그들에는 다른 방법이있다.

0

ANT를 사용하여 프로젝트를 빌드 할 때도 동일한 문제가있었습니다.

javac.compiler=org.eclipse.jdt.core.JDTCompilerAdapter 

에 :이 문제에 대한 해결책은 build.properties 파일 내부에 다음과 같은 속성을 변경하는 것이었다 문제를 해결

javac.compiler=modern 

을 프로젝트 컴파일하고 성공적으로 배치되었다.

관련 문제