我正在使用Groovy的静态类型检查器并遇到了一个有趣的问题。我有一个调用Java方法的Groovy方法。在Groovy方面,我已经
了import com.restfb.Parameter
import com.restfb.Connection
import com.restfb.Version
import com.restfb.DefaultFacebookClient
@TypeChecked
static List<Map<String, String>> getPages(accessToken, query) {
Connection<Page> conn = new DefaultFacebookClient(accessToken, Version.VERSION_2_5).fetchConnection(
"search", Page.class,
Parameter.with("q", query),
Parameter.with("type", "page"),
Parameter.with("fields", "name,about"),
Parameter.with("limit", 100)
);
conn.data.flatten().collect { p -> page2map(p) } // error here
}
在Java方面,我有
public static Map<String, String> page2map(Page page) {
Map<String, String> res = new HashMap<>();
res.put("likes", page.getName());
// some more stuff here
return res;
}
没有类型检查,这段代码运行正常。使用类型检查,我在Groovy代码的最后一行得到method cannot be applied to (capture<?>)
编译器错误。我正在运行Groovy 2.4.6。有什么建议吗?
答案 0 :(得分:0)
Groovy默认并假设您非常通用。在尝试与Java交谈时,这让我措手不及。
我怀疑flatten
或collect
正在为您提供ArrayList
或HashMap
。内联闭包可能会返回Object
。
由于您未明确指定collect
正在返回的内容,因此我希望它将返回ArrayList<Object>
,并且内联闭包将具有签名{{1} }。
尝试(大致)以下
非常明确Object f(Object x)
我还会看一下生成的groovy存根,以便更深入地了解正在发生什么类型的问题。您正在使用的闭包将显示为Map<String, String> my_method(Page p) = { return page2map(p) }
List<Map<String, String>> container;
container = conn.data.flatten().collect(my_method)
return container
您也可以考虑不使用TheClass$getPages$Inline$Closure$1
,因为不必处理类型是首先使用Groovy的优势。
此外,您可能需要@TypeChecked
而不是ClassName.page2map