我定义了以下方法。
class Some {
void doSome(Consumer<? super Other> consumer) {
}
<T extends Collection<? super Other>> T doSome(T collection) {
doSome(collection::add); // <<<<<<<<<<<<<<<<<<<
return collection;
}
}
现在
javac
抱怨了。
java:对 getAttributes 的引用不明确 ... 中的方法 doSome(java.util.function.Consumer) 和 ...Some 中的方法 doSome(T) 都匹配
为什么
javac
无法区分Consumer
和Collection
?
这里的问题与 Java 中的类型推断以及尝试解析重载方法时出现的歧义有关。在您的 Some 类中,您有两个 doSome 方法,并且类型推断系统很难根据提供的参数确定选择哪个方法。
产生歧义的原因是这两种方法都可能与您提供的参数类型匹配,并且编译器无法做出明确的决定。
为了解决这个问题,您可以在使用 lambda 表达式调用 doSome 方法时显式指定类型参数。这将有助于编译器选择正确的方法。这是一个例子:
Some someInstance = new Some();
someInstance.doSome((Consumer<Other>) other -> {
// Your consumer logic here
});
// Or, if you are using the collection method
List<Other> otherList = someInstance.doSome(new ArrayList<>());
通过在 lambda 表达式中显式指定类型参数,您可以向编译器提供清晰的指示,帮助它解决两个重载方法之间的歧义。