Java工厂继承与通用接口实现

Java工厂继承与通用接口实现,java,inheritance,interface,factory,Java,Inheritance,Interface,Factory,我希望有一个工厂继承另一个工厂,两个工厂都实现相同的通用接口,不同类型的接口相互继承: class FactoryA implements FactoryI<A> { // common code ... A get() { return new A(); } } class FactoryB extends FactoryA implements FactoryI<B> { B get() { r

我希望有一个工厂继承另一个工厂,两个工厂都实现相同的通用接口,不同类型的接口相互继承:

class FactoryA implements FactoryI<A> {
    // common code
    ...
    A get() {
        return new A();
    }
}

class FactoryB extends FactoryA implements FactoryI<B> {
    B get() {
        return new B();
    }
}

class B extends A {
}

FactoryI<T> {
    T get()
}
我的第一个版本没有从FactoryA继承FactoryB,这很好。 但事实证明,现在两个工厂之间都有我想要重用的通用代码


实现这一点的最佳方法是什么?

您还需要将
FactoryA
设置为通用。这样子类可以返回
a的不同子类

class FactoryA<T extends A> implements FactoryI<T> {
    // common code
    public T get() {
        return (T) new A();
    }
}

class FactoryB extends FactoryA<B> {
    public B get() {
        return new B();
    }
}

class A {

}

class B extends A {
}

interface FactoryI<T> {
    T get();
}
类FactoryA实现FactoryI{
//通用代码
公共部门得不到{
返回(T)新的A();
}
}
类FactoryB扩展了FactoryA{
公共B get(){
返回新的B();
}
}
甲级{
}
B类扩展了A类{
}
接口系数{
T get();
}

未选中的类型转换应该会提醒您。您现在可以编写
FactoryA f=new FactoryA()而不会出现错误。此实例化甚至不会引发警告,因为导致警告的问题代码位于
get()
方法中。@Holger有可能滥用此模式,但是,如果您第一次测试它时滥用了它,它将爆炸。这确实需要被调用者正确处理,但调用者不需要知道任何特殊情况,它甚至不能保证在以后调用
get()
时崩溃,因为该调用也可能在泛型代码中。它爆炸的地方是否与
FactoryA
的实例化有明显的联系是不可预测的。即使有,实例化也没有错。这是
FactoryA
的实现,也就是说,您可以轻松地创建一个干净的解决方案,
class FactoryA{/*common code*/public a get(){return new a();}public static final FACTORY i FACTORY_a=new FactoryA()::get;}
类FactoryB扩展FactoryA{@Override public B get(){return new B()}公共静态最终工厂i FACTORY_B=new FactoryB()::get;}
class FactoryA<T extends A> implements FactoryI<T> {
    // common code
    public T get() {
        return (T) new A();
    }
}

class FactoryB extends FactoryA<B> {
    public B get() {
        return new B();
    }
}

class A {

}

class B extends A {
}

interface FactoryI<T> {
    T get();
}