关于java:为什么我用@Override获得“必须覆盖超类方法”?

Why do I get “must override a superclass method” with @Override?

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

Multiple markers at this line
- implements android.view.View.OnClickListener.onClick
- The method onClick(View) of type new View.OnClickListener(){} must override a superclass method

我不明白为什么。这段代码取自我见过的许多例子。可能有什么问题?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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);
            }
        }
    });
}


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


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

  • 在Java 5中,EDCOX1和0的注释要求该方法实际上重写了一个超类中的方法。

  • 在Java 6和更高版本中,如果该方法在超类或接口中实现抽象方法,EDCOX1×0注释也将得到满足。

因此,在代码中看到这一点的最有可能的原因是,您要用Java 5编译器(或编译器的源遵从级别设置为5的其他编译器)编译Java 6(或更高版本)代码。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    <build>
        ...
        <plugins>
            ....
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>            
    </build>

如果将编译器设置为1.6,但仍然出现此错误,请尝试检查导入,因为Eclipse总是尝试这样做。

1
import android.content.DialogInterface.OnClickListener

而不是->

1
import android.view.View.OnClickListener

这解决了我的问题。


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

enter image description here


对我来说,发生这种情况是因为我想要重写的方法是package private,我试图从另一个包重写它。

Eclipse还将添加一个警告,在这种情况下,由于大量其他警告,我没有注意到。


放置一个view.onclickListener()解决了这个问题。我的Java编译器-->编译器遵从级别已经设置为1.6,但我仍然有同样的问题。

但是更改代码

1
2
3
4
5
6
7
8
rdBtn.setOnClickListener(new OnClickListener() {

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

1
2
3
4
5
6
7
8
rdBtn.setOnClickListener(new View.OnClickListener() {

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

解决了我的问题。