java - 将 java 方法引用分配给接口(interface)

标签 java lambda interface

我遇到了一些 java 代码,但无法理解它为什么能编译。

代码将方法引用传递给方法,而该方法接受接口(interface)。

根据我对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.
}
}

最佳答案

这里 - inject() 的签名是:

void put(C carrier, K key, String value);

它需要一个 C、一个 K 和一个字符串。又因为声明Propagation<String> a (也使用String),类型Kkey也必须是String

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

void put(String key, String value);

使用字符串键和值。

put2()put3()不要!这些方法对于 key 分别有不同的类型。值(value)。

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

关于java - 将 java 方法引用分配给接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44712650/

相关文章:

java - TableCellRenderer 出现问题,尝试在 JTable Cell 中添加 JLabel(image)

PHP 7 接口(interface),返回类型提示和 self

lambda - 将流与类和子类一起使用的最佳方法

python - `scipy.optimize.minimize` 中的 Jacobian 和 Hessian 输入

oop - 如何在 Ada 中实现接口(interface)?

objective-c - 将 ivar 放在类扩展中有什么问题?

java - 卡片布局面板显示错误面板 - Java Swing

Java - 获取 JSON 对象数组?

java - 类作业出错

c# - 使用字符串表达式 c# 将列表转换为字典