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

标签 java hibernate generics search hibernate-search

我使用 Java 已经有一段时间了,但有些事情我还是不太清楚,尤其是涉及到泛型时......

事情是这样的:我有一个正在使用的 Search 类 ( see here for details ),它的构造如下:

public Search(Class<?> searchClass) {...}

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

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

现在,我需要的是:我想创建参数化类,它包含这个类作为它的字段,例如

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...??? );
        ...
    }
    ...
}

我认为我面临的问题从给定的例子中是显而易见的。
有人可以建议在这里可以做什么,或者其他选择吗?

最佳答案

最简单的方法是将责任传递给实际实例化和使用 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);
        ...
    }
    ...
}

如果您的 BaseSelectorComposer 是一个抽象子类,它只被使用过

class IntSelectorComposer extends BaseSelectorComposer<Integer> {
    ...
}

即,作为“绑定(bind)”类型参数的类的基类,有多种方法可以obtain the type information via reflection (尽管这非常丑陋,因为恕我直言,API 并没有很好地支持它)。

关于Java 泛型 - Class<?> 构造函数参数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16962907/

相关文章:

java - 如何使用Spring boot通过post方法在postman中发送2个不同的对象?

C# 泛型类 : infer non-nullable type from nullable type parameter

java - 由于类型删除导致构造函数不明确

java mail - 处理csv附件

java - 补充 map

spring - 正在运行的测试在没有进行任何更改的情况下就停止了,这有什么问题?

java - 从 $TOMCAT_HOME\lib 读取属性文件

c# - 泛型接口(interface)的非泛型类实现不被继承

java - 更新 IBM Websphere (WAS) v8 的 (GC) 垃圾收集策略

java - 如何在 fragment 中的Listview上显示sqlite数据库内容?