为什么我用@Override得到“必须覆盖超类方法”?

时间:2012-01-02 04:54:43

标签: java android compiler-errors

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

  

此行的多个标记
     - 实现android.view.View.OnClickListener.onClick
     - 新的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);
            }
        }
    });
}

9 个答案:

答案 0 :(得分:136)

检查项目的属性并验证 Java编译器 - >编译器合规性级别设置为 1.6

答案 1 :(得分:46)

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

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

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

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

答案 2 :(得分:4)

如果将编译器设置为1.6并仍然出现此错误,请尝试检查导入,因为Eclipse的作用是它始终尝试执行此操作

import android.content.DialogInterface.OnClickListener  

而不是 - >

import android.view.View.OnClickListener

这解决了我的问题。

答案 3 :(得分:4)

MAVEN USERS 如果你正在使用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>

答案 4 :(得分:0)

放一个View.onCLickListener()解决了这个问题。我的Java编译器 - &gt;编译器的COmpliance级别已设置为1.6,但我仍遇到同样的问题。

但改变代码

rdBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                onRadioButtonClicked(v);
            }
        });

rdBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                onRadioButtonClicked(v);
            }
        });

解决了我的问题。

答案 5 :(得分:0)

对我来说,这是因为我想覆盖的方法是包私有,我试图从其他包中覆盖它。

Eclipse会另外发出一个警告,因为有大量其他警告,我没有注意到

答案 6 :(得分:0)

现在是2018年!为便于参考,请参见下面的屏幕截图。

enter image description here

答案 7 :(得分:0)

现在是2020年!您应该将符合性更改为1.8!

我尝试将合规性更改为1.6,但是没有用。而且我尝试将其随机更改为其他级别,例如11、12或13,但是它也不起作用。

看了一点之后,我发现了这个主题,它帮助我理解了: What is “compiler compliance level” in Eclipse?

阅读到Java编译器可以编译将在早期JVM版本上运行的代码。我将编译器级别更改为 1.8 ,它确实解决了问题。因此,始终以最高的合规水平为目标!

答案 8 :(得分:0)

现在是2020年-

项目>右键单击> Java编译器>编译器合规性级别>将此更改为1.8 [或最新级别]

enter image description here