我有時會遇到這種情況,不確定我是否使用了錯誤的方法,或者我不知道如何解決它。工廠模式和泛型
比方說,我有兩個階級,兩條豆這樣的:
public class BeanOne {
public void methodBeanOne() {
//...
}
}
public class BeanTwo {
public void methodBeanTwo() {
//...
}
}
public class ClassOne {
private BeanOne bean;
public ClassOne(BeanOne bean) {
this.bean = bean;
}
public void methodclassOne() {
bean.methodBeanOne();
}
}
public class ClassTwo {
private BeanTwo bean;
public ClassTwo(BeanTwo bean) {
this.bean = bean;
}
public void methodClassTwo() {
bean.methodBeanTwo();
}
}
我想打一個通用的抽象類,所以我可以從ClassOne
和ClassTwo
它,一個抽象的豆與提取一些邏輯常見的方法還有:
public abstract class AbstractBean {
public void commonMethod() {
//...
}
}
public class BeanOne extends AbstractBean {
public void methodBeanOne() {
//...
}
}
public class BeanTwo extends AbstractBean {
public void methodBeanTwo() {
//...
}
}
public abstract class AbstractClass<T extends AbstractBean> {
protected T bean;
public AbstractClass(T bean) {
this.bean = bean;
}
public void commonClassMethod(){
bean.commonMethod();
}
}
public class ClassOne extends AbstractClass<BeanOne> {
public ClassOne(BeanOne bean) {
super(bean);
}
public void methodclassOne() {
bean.methodBeanOne();
}
}
public class ClassTwo extends AbstractClass<BeanTwo> {
public ClassTwo(BeanTwo bean) {
super(bean);
}
public void methodClassTwo() {
bean.methodBeanTwo();
}
}
到目前爲止,一切都很好。
下一步將是創建一個工廠基礎上的enum
例如獲得一個實現了,這裏是我開始越來越錯誤:
public class ClassFactory {
public enum MyEnum {
ONE, TWO;
}
private ClassFactory() {
}
public static AbstractClass newInstance(MyEnum value, AbstractBean bean) {
switch(value){
case ONE:
return new ClassOne(bean);
case TWO:
return new ClassTwo(bean);
default:
throw new IllegalArgumentException();
}
}
}
這給出了以下編譯錯誤:
The constructor ClassOne(AbstractBean) is undefined
The constructor ClassTwo(AbstractBean) is undefined
我也試過:
public class ClassFactory {
public enum MyEnum {
ONE, TWO;
}
private ClassFactory() {
}
public static <T extends AbstractBean> AbstractClass<T> newInstance(MyEnum value, T bean) {
switch(value){
case ONE:
return new ClassOne(bean);
case TWO:
return new ClassTwo(bean);
default:
throw new IllegalArgumentException();
}
}
}
但隨後我得到:
Type mismatch: cannot convert from ClassOne to AbstractClass<T>
Type mismatch: cannot convert from ClassTwo to AbstractClass<T>
而我幾乎卡在那裏。我想我理解這個錯誤,但是,那麼是否有可能創建這樣一個工廠類試圖避免鑄件?
我也檢查了this post,但不能完全理解它如何幫助我。
編輯:訪問者模式
好了,我已經試過在previos崗位描述訪問者模式:
public interface Visitor<T> {
T visit(BeanOne bean);
T visit(BeanTwo bean);
}
public abstract class AbstractBean {
public void commonMethod() {
// ...
}
public abstract <T> T accept(Visitor<T> visitor);
}
public class BeanOne extends AbstractBean {
public void methodBeanOne() {
// ...
}
@Override
public <T> T accept(Visitor<T> visitor) {
return visitor.visit(this);
}
}
public class BeanTwo extends AbstractBean {
public void methodBeanTwo() {
// ...
}
@Override
public <T> T accept(Visitor<T> visitor) {
return visitor.visit(this);
}
}
public class ClassFactory {
private ClassFactory() {
}
public static AbstractClass<? extends AbstractBean> newInstance(AbstractBean bean) {
return bean.accept(new AbstractClassVisitor());
}
}
public class AbstractClassVisitor implements Visitor<AbstractClass<? extends AbstractBean>> {
@Override
public AbstractClass<? extends AbstractBean> visit(BeanOne bean) {
return ClassFactory.newInstance(bean);
}
@Override
public AbstractClass<? extends AbstractBean> visit(BeanTwo bean) {
return ClassFactory.newInstance(bean);
}
}
但是,使用這樣的:
AbstractBean bean = new BeanOne();
AbstractClass<? extends AbstractBean> clazz = ClassFactory.newInstance(bean);
clazz.commonClassMethod();
我收到以下例外情況:
Exception in thread "main" java.lang.StackOverflowError
at test.AbstractClassVisitor.<init>(AbstractClassVisitor.java:3)
at test.ClassFactory.newInstance(ClassFactory.java:9)
at test.AbstractClassVisitor.visit(AbstractClassVisitor.java:7)
at test.AbstractClassVisitor.visit(AbstractClassVisitor.java:1)
at test.BeanOne.accept(BeanOne.java:10)
at test.ClassFactory.newInstance(ClassFactory.java:9)
at test.AbstractClassVisitor.visit(AbstractClassVisitor.java:7)
at test.AbstractClassVisitor.visit(AbstractClassVisitor.java:1)
at test.BeanOne.accept(BeanOne.java:10)
at test.ClassFactory.newInstance(ClassFactory.java:9)
at test.AbstractClassVisitor.visit(AbstractClassVisitor.java:7)
at test.AbstractClassVisitor.visit(AbstractClassVisitor.java:1)
at test.BeanOne.accept(BeanOne.java:10)
...
我可以看到爲什麼會發生這種情況,我錯過了什麼嗎?
當你在'ClassOne'裏面調用'super(bean)'時 - 你調用哪個類的構造函數? – alfasin
@alfasin我會調用'AbstractClass'類中的public AbstractClass(T bean)'構造函數。 – carcaret
在第一個代碼示例中沒有'AbstractClass','ClassOne'沒有擴展任何類。 – alfasin