我正在调用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”如何解决这个问题的任何帮助将非常感激
答案 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!");
}
}