Java8重载能否区分函数参数参数类型?

Can Java 8 overloads differentiate between function parameter argument types?

我正在将 kotlin class 注入到我的 java 代码中。 kotlin class 有两个签名几乎相同的方法:

fun <R> isFluxAuthorizedFor(
                strings: List<StringRequest>,
                then: (responses: List<StringResult>) -> Flux<R>
        ): Flux<R> 

fun <R> isFluxAuthorizedFor(
                string: StringRequest,
                then: (per: StringResult) -> Flux<R>
        ): Flux<R> {

kotlin class 支持这种重载。

但是,让我的 IDE 使用正确的方法让我费了好大的劲。我有一个匹配前者签名的方法:

private Flux<AuthorizedStrings> collectResults(List<StringResult> responses)
    {
        //not yet implemented
        return null;            
    }

然而,当我尝试调用注入的 class' 方法时,出现编译错误:

List<StringRequest> allStrings = new ArrayList<StringRequest>();
Flux<UserReadAuthorizations> test =  authCheck.isFluxAuthorizedFor(allStrings, (it) -> this.collectResults(it) ); 

IDE提出两个建议:

"change type of 'it' to 'List<StringResult>'"

"change method 'collectResults(List<StringResult>)' to 'collectResults(StringResult)'"

两者都暗示 Java(或至少编译器)无法弄清楚我正在尝试调用 other 方法。这是尝试集成 Java 8 和 Kotlin 的问题吗? IDE 的怪癖? (我正在使用 Spring Tool Suite)一些愚蠢的用户错误,我还没有能够通过橡皮鸭?

我玩过你的代码,发现 IntelliJ 绊倒了整个 lambda 的类型。我不得不将 it -> this.collectResults(it) 转换为 Kotlin 期望的类型:

List<StringRequest> allStrings = new ArrayList<>();
Flux<UserReadAuthorizations> test = authCheck.isFluxAuthorizedFor(
    allStrings,
    (Function1<List<StringResult>, Flux<AuthorizedStrings>>) (it -> this.collectResults(it))
);

您方法本身的签名不是问题。希望这对你的STS也有帮助。