为什么我使用@Override得到“必须重写超类方法”?


68

以下代码在该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);
            }
        }
    });
}


如果将编译器更改为1.6无效,请刷新项目并进行构建。它为我工作。
Vineela Thonupunuri

Answers:


159

检查项目的属性,并验证Java Compiler-> Compiler合规性级别是否设置为1.6


11
谢谢!这样就解决了。这太神秘了。新手应该怎么知道这种事情?
理查德·恩

但是,现在程序由于强制关闭而崩溃-“已意外停止”。哇,很有帮助。
理查德·恩

我注释掉了setOnClickListener语句,但只留下了findViewById行,它仍然崩溃!仅获得Button对象的行为怎么会导致程序意外停止?
理查德·恩

我将其范围缩小到它只是不喜欢图像按钮的事实。如果我使用普通按钮,也可以。这令人费解
Richard Eng 2012年

1
“新手应该怎么知道这种事情?” -一个新手应该知道如何使用Google ...并找到此问答:-)但是,严重的是,对于计算机编程的奥秘,尚无实际解决方案。
史蒂芬C

53

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

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

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

因此,在您希望工作的代码中看到此错误的最可能的原因是,您正在使用Java 5编译器(或某些其他编译器的源遵从性级别设置为5)编译Java 6(或更高版本)代码。


8
感谢您实际解释为什么编译器合规性级别很重要。
黄檀

5

熟练的用户 如果您使用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

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

import android.content.DialogInterface.OnClickListener  

代替->

import android.view.View.OnClickListener

那解决了我的问题。



0

对我来说,发生这种情况是因为我想覆盖的方法是程序包私有的,并且我尝试从其他程序包中覆盖它。

在这种情况下,Eclipse将另外发出一个警告,由于大量其他警告,我没有注意到


0

View.onCLickListener()解决的问题交给我。我的Java编译器->编译器合规性级别已经设置为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);
            }
        });

解决了我的问题


0

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

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

阅读一会后,我发现了这个主题,它帮助我理解了: Eclipse中的“编译器遵从性级别”是什么?

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.