Я пытаюсь собрать 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()) */ }
}
Там довольно много обобщений, но я не могу знать T во время компиляции, и может быть несколько адаптеров, все с разными типамиТ. Это должно быть открыто третьим сторонам, поэтому мне также нужно как можно меньше реализации в реализации интерфейса, и это должен быть интерфейс (без абстрактного класса).
Теперь я хочу взятьэто и вызвать doWork с WorkUnit.Мой первый проход по коду выглядит так:
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);
Ой, это не компилируется:
The method doWork(WorkUnit<capture#2-of ?>) in the type Adapter<capture#2-of ?>
is not applicable for the arguments (WorkUnit<capture#4-of ?>)
Я знаю, что универсальный аргумент WorkUnit того же типа, что иAdapter.doWork () универсальный аргумент, но не зная типа, я не могу привести его соответствующим образом.
Так есть ли способ пройти через это?