尝试用Java构建可扩展的数据对象和适配器模式

尝试用Java构建可扩展的数据对象和适配器模式,java,reflection,Java,Reflection,我正在尝试使用适配器模式构建SDK。以下是到目前为止我得到的信息: interface Adapter<T> { void doWork(WorkUnit<T> unit); Class<T> getT(); } class WorkUnit<T> { public int getId() { ... } public T getExtras() { ... } } class OldWorkUnit { public &l

我正在尝试使用适配器模式构建SDK。以下是到目前为止我得到的信息:

interface Adapter<T> {
  void doWork(WorkUnit<T> unit);
  Class<T> getT();
}

class WorkUnit<T> {
  public int getId() { ... }
  public T getExtras() { ... }
}

class OldWorkUnit {
  public <T> void setExtra(T data) { /* Store data in Map<Class, Object> */ }
  public <T> WorkUnit<T> toNewWorkUnit(Adapter<T> adapter) { /* Map.get(adapter.getT()) */ }
}
接口适配器{
空道工(工作单元);
类getT();
}
班级工作单位{
public int getId(){…}
公共T getExtras(){…}
}
类旧工作单元{
public void setExtra(T data){/*将数据存储在Map*/}
公共工作单元toNewWorkUnit(适配器适配器){/*Map.get(Adapter.getT())*/}
}
这里有大量的泛型,但我在编译时不知道t,可能有多个适配器,所有适配器都有不同类型的t。这意味着要向第三方公开,所以我在接口实现中也需要尽可能少的实现,并且它必须是一个接口(没有抽象类)

现在我想拿着这个,用一个工作单元来调用doWork。我的第一次代码如下所示:

class FooAdapter implements Adapter<FooWorkUnit> {
  ...
}

OldWorkUnit w = new OldWorkUnit();
w.setExtra(new FooWorkUnit());

Adapter<?> a = new FooAdapter();
WorkUnit<?> unit = w.toNewWorkUnit(a);

a.doWork(unit);
类FooAdapter实现适配器{
...
}
OldWorkUnit w=新的OldWorkUnit();
w、 setExtra(新的FooWorkUnit());
适配器a=新的FooAdapter();
工作单位=w.TONEW工作单位(a);
a、 销钉(单位);
呃哦,这不符合:

The method doWork(WorkUnit<capture#2-of ?>) in the type Adapter<capture#2-of ?> 
is not applicable for the arguments (WorkUnit<capture#4-of ?>)
类型适配器中的方法doWork(工作单元)
不适用于参数(工作单元)
我知道WorkUnit泛型参数的类型与Adapter.doWork()泛型参数的类型相同,但是如果不知道类型,我就无法正确地强制转换它


有没有办法解决这个问题?

为什么要在这里通配符模板类

Adapter<?> a = new FooAdapter();
WorkUnit<?> unit = w.toNewWorkUnit(a);

因为新的。。。语句将通过反射进行处理。如问题中所述,直到运行时我才知道类型。编译后,用户可能想使用一个不了解任何Foo的BarAdapter。我认为这可以工作,但我现在不在我的编译器旁,所以我需要验证。我可以直接调用prepareArgsAndDoTheWork()吗?还是我需要提供一个类型?如果是这样,我找不到反射代码的例子。
Adapter<FooWorkUnit> a = new FooAdapter();
WorkUnit<FooWorkUnit> unit = w.toNewWorkUnit(a);
@SuppressWarnings("unchecked")
public <X> void prepareArgsAndDoTheWork() {
    OldWorkUnit w = new OldWorkUnit();
    w.setExtra(new FooWorkUnit());

    Adapter<X> a = (Adapter<X>) ... ; // Obtain the Adapter by reflection etc 
    WorkUnit<X> unit = w.toNewWorkUnit(a);
    a.doWork(unit);
}