2016-06-30 3 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' является' слово'? Что делать, если я вызываю '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); 
    } 
} 
Смежные вопросы