2016-06-30 9 views
0

インターフェイスHasWordとそれを実装するクラスWordがあるとします。以下は、List<Word>Consumerに、汎用関数の型パラメーターを指定してフィードを作成しようとしているカットダウンクラスです。これをどうやって行えばいいのでしょうか?ジェネリックメソッドで制約タイプを使用する

public static <T extends HasWord> void mapOverSentencesOfTokens(String input, 
              Consumer<List<T>> consumer) { 
    List<Word> sentenceForTagger = new ArrayList<>(); 
    consumer.accept(sentenceForTagger); 

} 

私はこの質問に不満がありましたが、私はこれを考えていませんでした。私はいくつかのアップホートトを配っていきます。

+3

どのようにコンパイラが 'T'は 'Word'であることを確認することができますか?もし 'mapOverSentencesOfTokens'を' OtherWordTypeHasWord'の推論タイプで呼び出すとどうなりますか?あなたの消費者は、そのタイプのリストだけを受け入れることができます。 –

答えて

4

あなたはConsumer<List<T>>と宣言しました。

したがって、acceptメソッドでは、パラメータとしてList<T>が必要です。

sentenceForTaggerは、List<Word>ではなく、List<T>です。

だから、コンパイラは文句を言う。

List<Word>List<T>と宣言できますが、同じ理由でWordをそのリストに追加することはできません。

ここに正しい方法は次のようになります。

public static void mapOverSentencesOfTokens(String input, Consumer<List<HasWord>> consumer) { 
    List<HasWord> sentenceForTagger = new ArrayList<>(); 
    sentenceForTagger.add(new Word()); 
    consumer.accept(sentenceForTagger); 
} 

または:

public class Example<T extends HasWord> { 

    private List<T> sentenceForTagger = new ArrayList<>(); 

    public void add(final T word) { 
     sentenceForTagger.add(word); 
    } 

    public void mapOverSentencesOfTokens(String input, Consumer<List<T>> consumer) { 
     consumer.accept(sentenceForTagger); 
    } 
} 
関連する問題