我需要帮助来生成和实现访客模式。
我们正在使用大量的instanceof,这很痛苦。我敢肯定它可以修改,但是我不确定该怎么做。

基本上我们有一个接口ProcessData

public interface ProcessData {
  public setDelegate(Object delegate);
  public Object getDelegate();
  //I am sure these delegate methods can use generics somehow
}


现在我们有一个实现ProcessDataGeneric的类ProcessData

public class ProcessDataGeneric implements ProcessData {
  private Object delegate;

  public ProcessDataGeneric(Object delegate) {
    this.delegate = delegate;
  }
}


现在,一个新的接口检索ProcessData

interface ProcessDataWrapper {
  public ProcessData unwrap();
}


现在,一个通用的抽象类实现了包装器,因此可以检索ProcessData

@XmlSeeAlso( { ProcessDataMotorferdsel.class,ProcessDataTilskudd.class })
public abstract class ProcessDataCommon implements ProcessDataWrapper {
  protected ProcessData unwrapped;

  public ProcessData unwrap() {
    return unwrapped;
  }
}


现在执行

public class ProcessDataMotorferdsel extends ProcessDataCommon {

  public ProcessDataMotorferdsel() {
    unwrapped = new ProcessDataGeneric(this);
  }
}


类似地

public class ProcessDataTilskudd extends ProcessDataCommon {

  public ProcessDataTilskudd() {
    unwrapped = new ProcessDataGeneric(this);
  }
}


现在,当我使用这些类时,我总是需要做instanceof

ProcessDataCommon pdc = null;
if(processData.getDelegate() instanceof ProcessDataMotorferdsel) {
   pdc = (ProcessDataMotorferdsel) processData.getDelegate();
} else if(processData.getDelegate() instanceof ProcessDataTilskudd) {
   pdc = (ProcessDataTilskudd) processData.getDelegate();
}


我知道有更好的方法可以做到这一点,但是我不知道如何利用泛型和访客模式。
任何帮助是极大的赞赏。

更新

我想补充一点,这些类只是更大的实现的片段。
ProcessDataProcessDataGeneric在委托之外(ProcessDataMotorferdsel等)。代表都扩展了ProcessDataCommon

我可以同意重构可能是最好的选择,但这是2年的生产代码,并且重构成本很高(时间,测试等)。但是,我愿意这样做。

更新#2

我试图启动通用进程,但是却遇到编译错误。这就是现在的样子。

public interface ProcessData<T extends ProcessDataCommon> {
  T getDelegate();
  setDelegate(T delegate);
}

public class ProcessDataGeneric<T extends ProcessDataCommon> implements ProcessData<T> {
  private T delegate;
  //Getter & setter
  public ProcessDataGeneric(T delegate) {
    this.delegate = delegate;
  }
}

public class ProcessDataMotorferdsel extends ProcessDataCommon {
  public ProcessDataMotorferdsel() {
    unwrapped = new ProcessDataGeneric<ProcessDataMotorferdsel>(this);
  }
}


我在行上得到编译错误:unwrapped = new ProcessDataGeneric<ProcessDataMotorferdsel>(this);

[javac] ProcessDataMotorferdsel.java:52: incompatible types [javac] found : ProcessDataGeneric<ProcessDataMotorferdsel> [javac] required: ProcessData<ProcessDataCommon> [javac]

我无法使该错误信息出现正面或反面。 ProcessDataMotorferdsel类扩展了ProcessDataCommon,因此IMO应该可以使用。

最佳答案

也许我也想念一些东西,但是

ProcessDataCommon pdc = null;
if(processData.getDelegate() instanceof ProcessDataCommon) {
   pdc = (ProcessDataCommon) processData.getDelegate();
}


应该等效..?如您所述,委托始终是ProcessDataCommon类型。

如果ProcessData#getDelegate()然后返回ProcessDataCommon,则也可以消除其余的instanceof检查。

08-04 19:11