我有以下接口和实现:
public interface InputDO<T> {
T getWrappedObject();
}
许多扩展接口,例如:
public interface InputPage<T> extends InputDO<T> {
String getName();
}
和实施类
public class InputPageImpl<T> implements InputPage<T> {
T wrappedObject;
String name;
@Override
public T getWrappedObject() {
return wrappedObject;
}
@Override
public String getName() {
return name;
}
}
然后我有一个数据查询对象的接口
public interface DataQuery<T extends InputDO<?>> {
void fetchResources(T object );
}
其中一项实施:
public class TestPageDataQuery implements DataQuery<InputPage<?>>
public void fetchResources( InputPage<?> page ) {
System.out.println(page.getName());
}
}
现在我想要一个与他们正在处理的类型相关联的DataQuery对象的映射。所以我有一个像这样的地图的上下文对象:
public class Context {
private final Map<Class<? extends InputDO<?>>, DataQuery<? extends InputDO<?>>> DATA_QUERIES = new HashMap<>();
public <T extends InputDO<?>> void registerDataQuery( Class<T> clazz, DataQuery<T> dataQuery ) {
DATA_QUERIES.put( clazz, dataQuery );
}
}
但是,当我尝试这样的事情时,我收到了编译错误:
context.registerDataQuery( InputPageImpl.class, new TestPageDataQuery() );
因为InputPageImpl是通用的,我不能做类似的事情:
InputPageImpl<?>.class.
当我将TestPageDataQuery重写为泛型类型并调用这样的寄存器方法时,它可以工作:
configuration.registerDataQuery( InputPageImpl.class, new TestPageDataQuery<InputPageImpl>() );
但是,我收到有关原始类型的编译警告。因为我不关心数据查询中的包装对象,所以我可以使用SuppressWarnings,但我仍然想知道是否有更好的解决方案。