将java方法引用分配给接口

将java方法引用分配给接口,java,lambda,interface,Java,Lambda,Interface,我偶然遇到一些java代码,不明白它为什么要编译 当方法接受接口时,代码将方法引用传递给方法 根据我对java的了解,这是不允许的,但令我惊讶的是,编译器接受了它 但如果我改变了方法签名的一部分,编译就会失败 请参考之前的代码 有人能解释一下为什么编译器接受a.injector(TextMap::put)并拒绝a.injector(TextMap::put2)和a.injector(TextMap::put3) ============== package testJava; import j

我偶然遇到一些java代码,不明白它为什么要编译

当方法接受接口时,代码将方法引用传递给方法

根据我对java的了解,这是不允许的,但令我惊讶的是,编译器接受了它

但如果我改变了方法签名的一部分,编译就会失败

请参考之前的代码

有人能解释一下为什么编译器接受a.injector(TextMap::put)并拒绝a.injector(TextMap::put2)和a.injector(TextMap::put3)

==============

package testJava;

import java.util.LinkedHashMap;
import java.util.Map;

public class Test {

final Map<Object, InjectorInterface<TextMap>> formatToInjector = new LinkedHashMap<>();

public interface TextMap {
    void put(String key, String value);

    void put2(String key, Integer value);

    void put3(Integer key, String value);
}

interface InjectorInterface<C> {
    InjectorInterface<C> inject(Object traceContext, C carrier);
}

public interface Propagation<K> {

    interface Setter<C, K> {
        void put(C carrier, K key, String value);
    }

    <C> InjectorInterface<C> injector(Setter<C, K> setter);
}

@SuppressWarnings("null")
public Test(final String condition) {
    final Propagation<String> a = null;
    // Let us forget the fact that a is null.
    this.formatToInjector.put(new Object(), a.injector(TextMap::put)); // compile pass.
    //      this.formatToInjector.put(new Object(), a.injector(TextMap::put2));// compile fail.
    //      this.formatToInjector.put(new Object(), a.injector(TextMap::put3));// compile fail.
}
}
包testJava;
导入java.util.LinkedHashMap;
导入java.util.Map;
公开课考试{
最终映射formatToInjector=新建LinkedHashMap();
公共接口文本映射{
作废放置(字符串键、字符串值);
void put2(字符串键,整数值);
void put3(整数键、字符串值);
}
接口注入接口{
InjectorInterface注入(对象traceContext,C载体);
}
公共接口传播{
接口设置器{
无效输入(C载波、K键、字符串值);
}
注入器接口注入器(设定器设定器);
}
@抑制警告(“空”)
公共测试(最终字符串条件){
最终传播a=零;
//让我们忘记a是空的这一事实。
this.formatToInjector.put(new Object(),a.injector(TextMap::put));//编译过程。
//this.formatToInjector.put(new Object(),a.injector(TextMap::put2));//编译失败。
//this.formatToInjector.put(new Object(),a.injector(TextMap::put3));//编译失败。
}
}

此处-inject()的签名为:

void put(C carrier, K key, String value);
它需要C、K和字符串。由于声明
传播a
(它也使用字符串),因此K键的类型也必须是字符串

现在让我们看看您打算使用的方法:

void put(String key, String value);
使用字符串键和值

put2()
put3()
不要!这些方法对于密钥resp有不同的类型。价值观


因此,
put()
是这里唯一具有匹配签名的方法

我想我找到了这个问题的答案。它可以通过java中的方法引用来解释。请参阅第页了解答案。

我理解您的观点,但请解释为什么编译器拒绝a.injector(TextMap::put2)和a.injector(TextMap::put3)。请您详细解释一下?我将TextMap::put传递给injector方法,假设TextMap::put得到评估并返回void。但injector方法接受Setter接口。您是否声称TextMap::put引用以某种方式变成了Setter接口的对象?我理解您的观点,编译器接受这行代码,因为签名匹配。还有一种想法是从最右翼开始的。无论如何,谢谢你的回答,它帮助我理解代码。当然。以防万一你打算再等一段时间,等待其他答案。。。还是别忘了在某个时候接受一些答案;-)根据您对Java的了解,什么样的方法签名应该接受方法引用?