我有以下工厂
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 :(得分: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);
}
}
}