Не могу связать TypeLiteral с помощью Guice - PullRequest
0 голосов
/ 04 июня 2018

Я начинаю изучать Guice, но я уже столкнулся с проблемой.Когда я пытаюсь связать TypeLiteral, я получаю Cannot resolve method 'to(anonymous com.google.inject.TypeLiteral<>.Я пытался найти причину проблемы, но безрезультатно.Может кто знает как это решить?

Вот класс, в котором я хочу использовать bind().

public class MainModule extends AbstractModule {
    protected void configure(){
        bind(DeckFactory.class).to(BlackjackDeckCreator.class);
        bind(CardFactory.class).to(BlackjackCardCreator.class);         
        bind(PointsCalculator.class)
          .to(BlackjackPointsCalculator.class);           
        bind(Logic.class)
          .toProvider(CompositeGameLogicStrategyProvider.class);
// Problem
        bind(new TypeLiteral<Randomizer<BlackjackCard>>() { })
          .to(new TypeLiteral<BlackjackCardRandomizer>() {}); 
//    
        bind(DecisionTaker.class)
          .toProvider(CompositeDecisionTakerProvider.class);
        bind(StatisticPrinter.class)
          .to(ConsoleStatisticPrinter.class);        
        bind(HitGameLogicStrategy.class)
          .toProvider(HitGameLogicProvider.class);      
        bind(StandGameLogicStrategy.class)
          .toProvider(StandGameLogicProvider.class);
        install(new FactoryModuleBuilder().build(GameFactory.class));
        install(new FactoryModuleBuilder()
          .build(PlayerFactory.class));       
        bind(StatisticsTemplate.class)
          .toProvider(StatisticsTemplateProvider.class);
    }
}

Randomizer.java

public interface Randomizer<T extends Card> {
    T randomizeCard(List<T> deck);
}

BlackjackCardRandomizer.java

public class BlackjackCardRandomizer implements Randomizer {
    private static final Random RANDOM = new Random();

    @Override
    public Card randomizeCard(List deck) {
        Integer randIndex = RANDOM.nextInt(deck.size());
        return (Card) deck.get(randIndex);
    }
}

Заранее спасибо!

1 Ответ

0 голосов
/ 04 июня 2018

Вместо этого следует использовать следующее:

bind(new TypeLiteral<Randomizer<BlackjackCard>>() { })
      .to(BlackjackCardRandomizer.class); 

То, что у вас есть TypeLiteral в качестве интерфейса, не означает, что вы должны использовать литералы типа в качестве реализации.

Также,измени свой extends:

public class BlackjackCardRandomizer implements Randomizer<BlackjackCard> {
    private static final Random RANDOM = new Random();

    @Override
    public BlackjackCard randomizeCard(List<BlackjackCard> deck) {
        Integer randIndex = RANDOM.nextInt(deck.size());
        return (Card) deck.get(randIndex);
    }
}
...