2017-06-23 11 views
0

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. 
} 
} 
+0

Javaの知識に基づいて、メソッドのシグネチャ*はメソッド参照を受け入れる必要がありますか? – shmosel

答えて

1

からinject()の署名である:

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

それはC、Kとを期待文字列。また、Propagation<String> a文字列も使用する)宣言のため、K キーのタイプは文字列でなければなりません。

void put(String key, String value); 

文字列キーと値を使用しています:

は、今あなたが使用する方法を見てすることができます。

put2()およびput3()です。これらのメソッドは、キーrespの型が異なります。値。

したがって、put()は、一致する署名を持つ唯一の方法です!

+0

私はあなたのところを理解していますが、なぜコンパイラーがa.injector(TextMap :: put2)とa.injector(TextMap :: put3)を拒否するのか説明できます。 –

+0

詳細を教えてください。私はTextMap :: putをインジェクタメソッドに渡し、TextMap :: putが評価され、voidを返すと仮定しよう。しかし、インジェクターメソッドはセッターインターフェースを受け入れます。何らかの理由でTextMap :: put参照がSetterインターフェイスのオブジェクトに変わったと主張していますか? –

+0

私は、署名が一致するので、コンパイラがその行のコードを受け入れるというあなたの意見を覚えています。最も右からカレーをかけるという、何らかの種類の概念があります。とにかく、あなたの答えをありがとう、それは私がコードを理解するのに役立ちます。 –

関連する問題