为什么我用@Override获得"必须覆盖超类方法"?

Ric*_*Eng 64 java android compiler-errors

以下代码在该public void onClick行生成此错误消息.

此行的多个标记
- 实现android.view.View.OnClickListener.onClick
- 类型new View.OnClickListener(){}的onClick(View)方法必须覆盖超类方法

我不明白为什么.这段代码来自我见过的众多例子.什么可能是错的?

private Button audioButton;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    audioButton = (Button) findViewById(R.id.imageButton1);
    audioButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View button) {
            if (button.isSelected()) {
                button.setSelected(false);
            }
            else {
                button.setSelected(true);
            }
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

Die*_*ano 143

检查项目的属性并验证Java Compiler - > Compiler compliance level是否设置为1.6.

  • 谢谢!修好了.这太神秘了.一个新手怎么会知道这种事情? (11认同)
  • *“新手应该如何知道这种事情?”* - 新手应该知道如何谷歌......并找到这个问答:-) 但说真的,计算机问题没有实际的解决方案编程是神秘的。 (2认同)

Ste*_*n C 47

这很可能是由于Java 1.5和1.6之间的源代码级别不兼容.

  • 在Java 5中,@Override注释要求该方法实际上覆盖了超类中的方法.

  • 在Java 6及更高版本中,如果方法在超类或接口中实现抽象方法,@Override将满足注释.

因此,在您期望工作的代码中看到这一点的最可能的原因是您正在使用Java 5编译器(或编译器的源合规性级别设置为5的其他编译器)编译Java 6(或更高版本)代码.

  • 感谢您实际解释*为什么*编译器合规性级别很重要. (8认同)

小智 5

MAVEN 用户 如果您使用 Maven 进行构建,它可以在构建期间覆盖 eclipse 设置。因此,如果您将 Eclipse 设置为 1.7,但没有专门设置 Maven JDK 构建版本(在撰写本文时默认为 1.5),那么它会将 Eclipse 目标编译器重置回 1.5。设置Maven编译器如下。

    <build>
        ...
        <plugins>
            ....
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>            
    </build>
Run Code Online (Sandbox Code Playgroud)