2016-11-28 5 views
1

У меня есть следующий заводConvert завод шаблон для модуля Guice

public class AppleFactory<T extends Fruit> 
    extends AbstractAppleFactory<Class<T>, TypeOfFruits, Fruits<T>> 
{ 
    private static final AppleFactory factroy = new AppleFactory(); 

    private AppleFactory() 
    { 
    } 

    public static Fruits<? extends Fruit> get(Class<? extends Fruit> clazz, 
     TypeOfFruits typeOfFruits) 
    { 
     return (Fruits<? extends Fruit>) factroy.getInstance(clazz, typeOfFruits); 
    } 

    @Override 
    protected Fruits<T> newInstance(Class<T> clazz, TypeOfFruits typeOfFruits) 
    { 
     final Fruits<T> fruits; 
     fruits = new FruitsImpl<T>(clazz, typeOfFruits,"hello"); 
     return fruits; 
    } 
} 

И я попытался преобразовать его в скороговорку Guice модуля, делая это:

@ImplementedBy(AppleFactoryImpl.class) 
public interface AppleFactory<T extends Fruit> 
{ 
    Fruits<? extends Fruit> get(Class<? extends Fruit> clazz, 
     TypeOfFruits typeOfFruits) 
} 

@Singleton 
public class AppleFactoryImpl implements AppleFactory 
{ 
    @Override 
    public Fruits<? extends Fruit> get(Class<? extends Fruit> clazz, 
     TypeOfFruits typeOfFruits) 
    { 
     final Fruits<T> fruits; 
     fruits = new FruitsImpl<T>(clazz, typeOfFruits,"hello"); 
     return fruits; 
    } 
} 

Но я получаю сообщение об ошибке в реализация. В нем говорится, что он не может разрешить тип T для фруктов.

Моя конечная цель иметь различные реализации через этот завод т.е. связать

FruitFactory, FruitFactory

к конкретным реализациям.

Это может быть изменен, чтобы использовать провайдер или что-нибудь еще, я не слишком жестким на подходе

Кто-нибудь знает, как это исправить?

+0

Какая у вас конечная цель? Связано ли это с 'FruitFactory ' 'FruitFactory ' конкретным реализациям? –

+0

@DavidRawson, да, это конечная цель. Разве что я могу положить какие-то фрукты на эту фабрику и инициализировать ее. – Schumi

+0

Отлично! Можете ли вы изменить свой вопрос, чтобы прояснить это? Тогда кто-то сможет ответить –

ответ

1

Нет никакого движения от общего к конкретному в том, что вы написали. Вы хотите, чтобы ваши общие типы в конечном итоге были разрешены конкрециями, не так ли? Интересно, если ваши цели могут быть достигнуты с чем-то вроде следующих:

Общего интерфейса:

public interface FruitFactory<T extends Fruit> { 
     T get(); 
    } 

бетона реализаций:

public class AppleFactory implements FruitFactory<Apple> { 

     @Override 
     public Apple get() { 
      return new Apple("apple"); 
     } 
    } 

    public class OrangeFactory implements FruitFactory<Orange> { 

     @Override 
     public Orange get() { 
      return new Orange("orange"); 
     } 
    } 

И, наконец, модуля, который связывает их, как это :

public class FruitFactoryModule implements Module { 

     @Override 
     public void configure(Binder binder) { 
      binder.bind(new TypeLiteral<FruitFactory<Apple>>() {}).to(AppleFactory.class); 
      binder.bind(new TypeLiteral<FruitFactory<Orange>>() {}).to(OrangeFactory.class); 
     } 
    } 
} 
+0

В настоящее время я использую Factory, который я предоставил выше, и я привязываю его, как это bind (новый TypeLiteral >() {}). To ((Fruit ) FruitFactory.get (Apple.class, новый TypeOfFruits())); – Schumi

+0

Я не уверен, могу ли я действительно помочь больше, чем возможно - возможно, вы можете уточнить свой вопрос, чтобы он был немного яснее? Тем временем, пожалуйста, ознакомьтесь с руководством пользователя Guice (github.com/google/guice/wiki/Motivation). Ваше решение Guice должно выглядеть, по крайней мере, как один из их примеров. –