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();
}