2017-10-27 9 views
2

私はこのチュートリアルに基づいてelasticsearchプラグインを書いている: Creating an elasticsearch plugin, the basics「Vは、機能インタフェースではありません」というエラー

ここで私はエラー「Vは、機能インタフェースではありません」取得しています:

@Override 
    public Map<String, AnalysisModule.AnalysisProvider<TokenFilterFactory>> getTokenFilters() { 
     return Collections.singletonMap("jettro", MyTokenFilterFactory::new); 
    } 
MyTokenFilterFactoryため

コード:

public class MyTokenFilterFactory extends AbstractTokenFilterFactory { 

public MyTokenFilterFactory(IndexSettings indexSettings, String name, Settings settings) { 
    super(indexSettings, name, settings); 
} 

@Override 
public TokenStream create(TokenStream tokenStream) { 
    return new TokenFilter(tokenStream); 
} 
+1

Collections.singletonMapは、第2引数として値を期待しています。サプライヤやその他の機能的インタフェースの実装ではありません。 –

+0

k5_のコメントを展開するにはエラーに表示される「V」は、「singletonMap(K key、V value)」のジェネリックタイプです。これは、「Collections.singletonMap( "jettro"、new MyTokenFilterFactory()); 。 – Thomas

+0

それではチュートリアルのコードはなぜ機能していますか? –

答えて

2

AnalysisModule.AnalysisProviderの定義は

ですメソッド参照を経由して、このインターフェイスにコンストラクタをバインドするには、それはまったく同じシグネチャを持つ必要があり、すなわち、あなたがその追加のパラメータを無視して

に宣言を変更する必要があります3210

public interface AnalysisProvider<T> { 
    T get(IndexSettings indexSettings, Environment environment, 
      String name, Settings settings) throws IOException; 
    // irrelevant default methods omitted 
} 

。あなたは普通の発信者が不要なパラメータを提供したくない場合は、コンストラクタ

public class MyTokenFilterFactory extends AbstractTokenFilterFactory { 

    public MyTokenFilterFactory(IndexSettings indexSettings, Environment environment, 
           String name, Settings settings) { 
     super(indexSettings, name, settings); 
    } 
    public MyTokenFilterFactory(IndexSettings indexSettings, 
           String name, Settings settings) { 
     super(indexSettings, name, settings); 
    } 

    @Override 
    public TokenStream create(TokenStream tokenStream) { 
     return new TokenFilter(tokenStream); 
    } 
} 

をオーバーロードすることもできますし、あなただけのオリジナルのコンストラクタにのみ必要なパラメータを宣言しておくと、ラムダ式にメソッド参照を変更します。

誤解を招くようなコンパイラエラーメッセージが原因 singletonMap呼び出し及びメソッド参照に型推論との間の複雑な相互作用にほとんど可能性があること
public Map<String, AnalysisModule.AnalysisProvider<TokenFilterFactory>> getTokenFilters() { 
    return Collections.singletonMap("jettro", 
            (is, env, n, s) -> new MyTokenFilterFactory(is, n, s)); 
} 

注意。あなたはsingletonMap呼び出しの明示的な型、すなわち

public Map<String, AnalysisModule.AnalysisProvider<TokenFilterFactory>> getTokenFilters() { 
    return Collections. 
     <String, AnalysisModule.AnalysisProvider<TokenFilterFactory>> 
     singletonMap("jettro", MyTokenFilterFactory::new); 
} 

を使用する場合は、直ちに不一致コンストラクタ署名に関する意味のエラーメッセージが表示されます。大まかには、新しいJava言語の構文で奇妙なエラーメッセージが表示される場合は、わかりやすいエラーメッセージが表示されるまで明示的な型を挿入してください。問題を修正した後、不要な明示的な型を再び削除することができます。

関連する問題