java泛型-class< ?>构造函数参数问题

8ftvxx2r  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(499)

我用java已经有一段时间了,但是有些东西我还是不太清楚,特别是在泛型方面。。。
事情是这样的:我有这个 Search 我正在使用的类(请参阅此处了解详细信息),其构造如下:

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

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

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

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

hl0ma9xz

hl0ma9xz1#

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

i、 例如,作为“绑定”类型参数的类的基类,有一些方法可以通过反射获得类型信息(尽管这非常难看,因为api imho并没有很好地支持这一点)。

wlsrxk51

wlsrxk512#

一般来说,这是一个很难解决的方案。在.net背景下,我个人发现很少有情况可以解决这个问题,因为java不支持静态泛型类型解析(例如在.net中可以使用 typeof(T) ).
为了解决这个问题,我建议您找到一种方法,要么从外部获取类,要么获取该类的示例。一个可能的解决办法是改变 doAfterCompose 方法之一:

@Override
public void doAfterCompose(Window comp, Class<?> entityClass) throws Exception {
    super.doAfterCompose(comp);
    this.searchObject =
         new HibernateSearchObject<T>(entityClass);
    ...
}

-或者-

@Override
public void doAfterCompose(Window comp, SomeEntity entity) throws Exception {
    super.doAfterCompose(comp);
    this.searchObject =
         new HibernateSearchObject<T>(entity.getClass());
    ...
}

如果不能修改方法签名(我看到它是重写),请尝试使用类的成员 BaseSelectorComposer<T> 这将保持理想的 Class<?> 示例。

public class BaseSelectorComposer<T> extends SelectorComposer<Window> {
    private Class<?> entityClass;

    public BaseSelectorComposer<T>(Class<?> entityClasss) {
        this.entityClass = entityClass;
    }

   ....
    @Override
    public void doAfterCompose(Window comp) throws Exception {
        super.doAfterCompose(comp);
        this.searchObject =
            new HibernateSearchObject<T>(this.entityClass);
       ...
    }
}

相关问题