为什么hankcs / AhoCorasickDoubleArrayTrie中的lambda示例不起作用?

时间:2019-01-31 22:20:01

标签: java lambda aho-corasick

我只是从此github project page复制示例而未做任何更改,这给了我一个编译错误

要重现,请将此依赖项添加到pom

<dependency>
  <groupId>com.hankcs</groupId>
  <artifactId>aho-corasick-double-array-trie</artifactId>
  <version>1.2.1</version>
</dependency>

然后尝试运行此命令:

    // Collect test data set
    TreeMap<String, String> map = new TreeMap<String, String>();
    String[] keyArray = new String[]
            {
                    "hers",
                    "his",
                    "she",
                    "he"
            };
    for (String key : keyArray)
    {
        map.put(key, key);
    }
    // Build an AhoCorasickDoubleArrayTrie
    AhoCorasickDoubleArrayTrie<String> acdat = new AhoCorasickDoubleArrayTrie<String>();
    acdat.build(map);
    // Test it
    final String text = "uhers";
    acdat.parseText(text, (begin, end, value) -> {
        System.out.printf("[%d:%d]=%s\n", begin, end, value);
    });

编译错误为

The method parseText(CharSequence, AhoCorasickDoubleArrayTrie.IHit<String>) is ambiguous for the type AhoCorasickDoubleArrayTrie<String>

如果您需要任何澄清,请告诉我。您应该可以使用我在这里提供的内容来重现此内容。

此外,在我之前发布此内容时,有人建议这可能是duplicate question,但我认为情况并非如此,因为该问题与lambda函数无关。如果我错了,请帮助我理解该问题的答案如何解决我遇到的问题

1 个答案:

答案 0 :(得分:1)

AhoCorasickDoubleArrayTrie有两个称为parseText的方法,一个带有IHit的方法,另一个带有IHitCancellable作为参数的方法。这两个接口都声明一个方法boolean hit(int begin, int end, V value),因此使用lambda,编译器将不知道您打算调用哪种方法。

我没有通过谷歌搜索找到快速解决方案,但是您可以做的是声明自己的类,并使用自己的方法扩展AhoCorasickDoubleArrayTrie,该方法在具有您要接口的超类中调用预期的方法使用,例如

void myParseText(String text, IHit<V> hit) {
    super.parseText(text, hit);
}