我想在Java中实现某种组件系统。使用Java通配符
有一个接口,称为表
interface Form<T> {
T getObject();
// ...
}
,我想提供一些所谓的CompoundForm协助从简单的形式构建复杂的形式抽象类。 CompoundForm的
用户需要使用组件的接口来提供每个组件的一些描述
interface Component<T, U> {
/** Factory method to build new form for given component */
Form<U> createForm(U u, String prefix);
/** Extract component of type U from the compound t */
U get(T t);
/** Mutate t or build new compound of type T using information from u */
T set(T t, U u);
}
鉴于此接口CompoundForm实现是一样的东西:
abstract class CompoundForm<T> implements Form<T> {
/** User should override this method and provide a collection of
* actual components of different types, hence ? wildcard */
protected abstract Map<String, Component<T, ?>> componentMap();
private Map<String, Form<?>> formMap = new TreeMap<String, Form<?>>();
private final T object;
public CompoundForm(T object, String prefix) {
this.object = object;
for (Entry<String, Component<T, ?>> e: componentMap()) {
String subPrefix = e.getKey();
Component<T, ?> component = e.getValue();
// !!! Compile error here: type error
Form<?> form = component.createForm(component.get(object), prefix + subPrefix);
formMap.put(subPrefix, form);
}
}
public T getObject() {
T result = object;
for (Entry<String, Component<T, ?>> e: componentMap()) {
String subPrefix = e.getKey();
Component<T, ?> component = e.getValue();
Form<?> form = formMap.get(subPrefix);
// !!! Compile error here: type error
result = component.set(result, form.getObject());
}
return result;
}
}
是否有可能实现这样的事情在类型安全的方式没有未经检查的强制转换?我的通配符的用法是否正确?