在泛型方法中使用约束类型

时间:2016-06-30 15:45:16

标签: java generics

考虑一个接口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);

}

我问这个问题很糟糕,我没有想到这一点。我将分发一些赞成票,然后溜走。

1 个答案:

答案 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);
    }
}