我遇到了一些 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/