【问题标题】:Java Anonymous Class with Interface带接口的 Java 匿名类
【发布时间】:2016-06-23 13:10:21
【问题描述】:

我很久没有写 Java 了,需要一些(也许)简单的帮助。

所以我得到了这个Class,其中声明了Interface

public class test(){
   
interface Checker(){
 public check();
}

public someFunction(List param1, Checker param2){
   //[do something here]
}
...


public static void main (...){

   someFunction(List param1, new Checker(){
          ...
          //[implementation of interface]
          ...
      });
 }

所以我的问题是,(并且实际代码工作正常)

  1. 我真的不明白为什么方法someFunction(); 需要Interface 作为参数

  2. 我也不明白为什么我可以将一个接口的实例传递给那个函数(inmain()). The second argument that I'm passing the someFunction();`,是一个接口的实例,对? 好吧,我在想的是,它实际上是某种匿名类,因此它可能是可能的。

但正如我所说,我已经有一段时间没有编写 java 代码了,还没有找到答案,所以如果有人能向我解释这段代码为什么以及如何工作,我将不胜感激。

【问题讨论】:

  • 这不会编译。 check 缺少返回类型。
  • 1.因为它是这样写的。 2. 是的,这是匿名类。
  • 针对接口实现是针对紧密耦合的常见做法。 someFunction 不在乎您如何“检查”。您可以通过注入 Checker 的不同实现来配置 someFunction 的行为。看排序:通过注入 Comparator 可以翻转排序顺序。
  • “有人可以解释一下这段代码为什么以及如何工作” --- 这很简单:它不是

标签: java class interface anonymous


【解决方案1】:

1) 因为根据定义public someFunction(List param1, Checker param2) 需要一个 Checker 对象(参见参数 2) 2) 是的,它是一个匿名类,它的一个实例new Checker() 创建了一个被传递的类的对象。

因此,代码有效。

【讨论】:

    【解决方案2】:
    1. 我真的不明白,为什么 someFunction() 方法需要一个接口作为参数

    这是开发人员的选择,但在这里使用接口允许您使用任何实现 - 并且只有接口允许 Java 中的一种多重继承。

    1. 我也不明白为什么我可以将接口的实例传递给该函数(在 main() 中)。我传递 someFunction() 的第二个参数是接口的实例,对吗?好吧,我在想的是,它实际上是某种匿名类,因此它可能是可能的。

    您看到的代码基本上创建了该匿名类的接口和实例的匿名实现。所以你的猜测在这里是正确的。

    【讨论】:

      【解决方案3】:

      我假设 public check() 是一个错字。

      1. 我真的不明白,为什么 someFunction() 方法需要一个接口作为参数

      为什么不呢?你的接口是Checker,你的方法签名是

      public someFunction(List param1, Checker param2)
      

      第二个参数采用Checker

      1. 我也不明白为什么我可以将接口的实例传递给该函数(在 main() 中)。

      您没有传递接口的实例。您正在传递一个匿名课程。当你说:

      new Checker(){
                ...
                //[implementation of interface]
                ...
            });
      

      你正在实现接口。

      【讨论】:

      • 那么,对于实现接口的匿名类来说,这是某种简短的咒语吗?代替 --> new nameOfAnonymousClass 实现 Checker,你可以写 new Checker() ?
      • 顺便说一句。 “公共检查();”不是错字,而是该接口的示例函数(由于它属于该接口,因此未实现)
      • 是的。当你说new SomeInterface(){/**implementation**/} 那是一个匿名类。如果您说new SomeClass implements SomeInterface(){} 将不再是匿名的,是吗?现在应该是 SomeClass 我不相信这种语法是有效的。
      • @Malte2323 有一个错字:您忘记了返回类型。