为什么java编译器不区分不同类型的方法?

问题描述 投票:0回答:1

我定义了以下方法。

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 generics type-erasure
1个回答
0
投票

这里的问题与 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 表达式中显式指定类型参数,您可以向编译器提供清晰的指示,帮助它解决两个重载方法之间的歧义。

© www.soinside.com 2019 - 2024. All rights reserved.