当前位置: 首页 > 知识库问答 >
问题:

无法使用“”,因为非私有方法不会重写或实现超类型中的方法

屠德宇
2023-03-14

我有下面指定的行为。

interface ValueEditorPopupView<T> {
  void setValue(T value);

  void setApplyEnabled();
}

abstract class ValueEditorPopup<T> implements ValueEditorPopupView<T> {
  @Override
  public void setApplyEnabled() {
    System.out.println("In ValueEditorPopup.setApplyEnabled()");
  }
}

class ListEditorTextField {
  private final ValueEditorPopup<String> popup;

  ListEditorTextField() {
    popup = new ValueEditorPopup<>() {
      @Override
      public void setValue(String value) {
        System.out.println("In Anonymous Class impl setValue()");
      }

      // When I add a method that is NOT defined in the abstract class/interface
      // I get an error for using the diamond operator in the class declaration above
      // "Cannot use '<>' due to non-private method which 
      // doesn't override or implement a method from a supertype"
      // This error clears if I explicitly specify `new ValueEditorPopup<String>(){}`
      // in the anonymous class instantiation or 
      // add `getValues` to the abstract class/interface.
      public void getValues() {}
    };
  }

}

我不明白为什么会导致错误以及为什么添加这些方法/类型会修复它。不确定我在这里错过了什么。

共有1个答案

殳经略
2023-03-14

这是根据设计,并在JLS§15.9.5中规定:

如果具有ClassBody的类实例创建表达式使用菱形(

您的publicgetValue方法没有覆盖超类中的任何内容,因此由于隐式添加了@override,因此出现了一个错误。

这样做的理由是:

当<代码>

我对此的解释是,当您在匿名类中声明公共方法时,它最有可能覆盖一个方法,因此当您使用时,编译器会隐式地将@Overder放在您的所有公共方法上

很少需要在匿名类中声明公共方法而不重写。如果要声明一个方法,只需将其声明为私有方法——除非将new表达式指定给var,否则无论如何都不能从外部调用它,这是非常罕见的。

 类似资料:
  • 我有以下代码:https://pastebin.com/19njjj9s(我放在这里是因为对于stackoverflow来说代码太多了) 但是它不会覆盖onClick方法(第192行),我不明白为什么。 重写onclick方法背后的想法是获取日期并接收radiogroup以设置其中一个值。如果有人能帮我,我会帮你的。

  • 我正在使用JUnit 5,并从“软件测试”书中复制了代码,以便创建一个模拟对象进行测试。部分测试器代码是: 我有一个编译器错误,它说“方法isLeap(int)必须覆盖或实现一个超类型方法”。此错误在我覆盖isLeap()方法的行中报告。(@over下面的行) 好吧,令人惊讶的是,这就是我所做的。所以我不知道这是什么抱怨。下面是simpleDate类中的isLeap()方法: 正如您所看到的,测试

  • 我有3个类,配置如下:Class1有几个方法,其中一些是抽象的: 接下来,来自同一个包的class 2扩展了class 1,覆盖了它的抽象方法并添加了一些其他方法: 最后,另一个包中的class3扩展了class2并覆盖了class1中的一个方法: 我正在使用Eclipse,并且它在编码时不会检测到任何错误。我正在使用Maven Build构建项目,但构建失败,说thisIsTheMethod o

  • 我有一个超级班 我希望这个孩子班级 但是Xcode说 重写实例方法必须与它重写的声明一样可访问 那么,我如何覆盖超类中的公共方法是子类中的私有方法 谢谢你

  • 我是Android和Java的初学者。我寻找这个错误的答案,但stackOverflow中的任何东西都不适合我的情况。我在读一本书,书中说我们需要使用一个onListItemClick()方法,该方法来自我们创建的扩展ListFragment的类(CrimeListFragment)(使用该方法和类是必需的)。 然而,我不断发现以下错误: 错误说 “CrimeListFragment类型的onLi