Groovy:方法无法应用于(捕获<! - ? - >)

时间:2016-04-11 21:16:28

标签: groovy typechecking

我正在使用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。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

Groovy默认并假设您非常通用。在尝试与Java交谈时,这让我措手不及。

我怀疑flattencollect正在为您提供ArrayListHashMap。内联闭包可能会返回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