接口中的通用参数隐藏在实现

时间:2016-10-26 12:26:01

标签: java generics

我有以下接口和实现:

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,但我仍然想知道是否有更好的解决方案。

0 个答案:

没有答案