关闭强制在某些情况下不起作用

时间:2015-08-12 12:34:02

标签: groovy

我正在调用Groovy的Java方法,它希望将SAM接口的实例作为参数。

通常Groovy很高兴在这些情况下传递一个闭包,并相应地强制它,但在这种情况下,接口扩展另一个并覆盖单个方法。

注意 - 它仍然只有一种方法,但它已被覆盖。

在这种情况下,Groovy不会自动强制关闭,而我似乎能够调用它的唯一方法是使用“AS”。

我正在发布一个API来帮助孩子们学习代码,并且真的不希望他们必须使用“AS”,因为这会使事情变得复杂。

以下是一些显示问题的代码......

爪哇

public interface BaseHandler<T> {
    public void handle(T test);
}

public interface Handler extends BaseHandler<String> {
    public void handle(String test);
}

public class LibraryClass {
    public void method(Handler handler) {
        handler.handle("WORLD!");
    }
}

Groovy的

LibraryClass bar = new LibraryClass();
bar.method({ name -> println "HELLO " + name})

错误

Caught: groovy.lang.MissingMethodException: No signature of method: Bar.doIt() is applicable for argument types: (testClosures$_run_closure1) values: [testClosures$_run_closure1@fe63b60]

如果不使用“AS”如何解决这个问题的任何帮助将非常感激

1 个答案:

答案 0 :(得分:2)

Groovy希望通过强制实现接口,但不知道它应该实现哪种接口方法。因为有2: 句柄(String test)和第二个:handle(String test)(baseHandler)

解决方案是从处理程序中删除句柄(字符串测试)(因为泛型而已经没有添加任何东西,因为BaseHandler已经提出了这个方法)。

像这样它可以正常工作:

public interface BaseHandler<T> {
    public void handle(T test);
}

public interface Handler extends BaseHandler<String> {

}

public class LibraryClass {
    public void method(Handler handler) {
        handler.handle("WORLD!");
    }
}