Javaコードにバンプがあり、コンパイルの理由を理解できませんでした。インタフェースへのJavaメソッドリファレンスの割り当て
メソッドがインターフェイスを受け付ける間、コードはメソッドへのメソッド参照を渡します。
私のJavaの知識に基づいて、これは許可されていませんが、私の驚いたことに、コンパイラはそれを受け入れます。
しかし、メソッドシグネチャの一部を変更すると、コンパイルが失敗します。
(TextMap ::誰でもコンパイラはa.injector(TextMap ::入れ)を受け入れ、a.injector(TextMap :: put2を)拒否する理由説明を与えるとa.injectorでし
前にコードを参照してください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.
}
}
Javaの知識に基づいて、メソッドのシグネチャ*はメソッド参照を受け入れる必要がありますか? – shmosel