Java泛型 - 类<?>构造函数参数问题

Les*_*ess 5 java generics search hibernate hibernate-search

我已经使用Java很长一段时间了,但有些事情对我来说仍然不太清楚,特别是涉及到泛型......

事情就是这样:我Search正在使用这个类(详见此处),构造如下:

public Search(Class<?> searchClass) {...}
Run Code Online (Sandbox Code Playgroud)

此外,我有一个参数化的通用包装器,如下所示:

public class HibernateSearch<E> extends Search implements Serializable {
    public HibernateSearch(Class<E> entityClass) {
        super(entityClass);
    }
    // ... omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)

现在,我需要的是以下内容:我想创建参数化类,其中包含此类作为其字段,例如

public class BaseSelectorComposer<T> extends SelectorComposer<Window> {

    private HibernateSearch<T> searchObject;
    ...
    @Override
    public void doAfterCompose(Window comp) throws Exception {
        super.doAfterCompose(comp);
        this.searchObject =
             new HibernateSearchObject<T>( now what...??? );
        ...
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我认为,从给定的例子中我所面临的问题是显而易见的.
有人可以建议在这里可以做些什么,或者一些替代方案?

Dir*_*irk 5

最简单的方法是将责任转嫁给实际实例化并使用实例的人BaseSelectorComposer,即:

public class BaseSelectorComposer<T> extends SelectorComposer<Window> {

    private HibernateSearch<T> searchObject;
    private final Class<T> theType;

    public BaseSelectorComposer(Class<T> token) {
        theType = token;
    }

    ...
    @Override
    public void doAfterCompose(Window comp) throws Exception {
        super.doAfterCompose(comp);
        this.searchObject = new HibernateSearchObject<T>(theType);
        ...
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果你BaseSelectorComposer是一个抽象的子类,它只用过像

class IntSelectorComposer extends BaseSelectorComposer<Integer> {
    ...
}
Run Code Online (Sandbox Code Playgroud)

即,作为类的基类,"绑定"类型参数,有方法通过反射获取类型信息(虽然这非常难看,因为这在API恕我直言中并不是很好支持).