考虑一个接口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);
}
我问这个问题很糟糕,我没有想到这一点。我将分发一些赞成票,然后溜走。
答案 0 :(得分: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);
}
}