有什么方法可以在Java中实例化Class <c <a,b >>对象?

时间:2018-09-04 12:18:33

标签: java generics type-erasure

我正在尝试在Java中使用Hibernate和TypedQuery。

我尝试调用的方法的签名为

<T> TypedQuery<T>   createQuery(String qlString, Class<T> resultClass)

我想像波纹管那样称呼它,但将null替换为真实实例。

 Class<Tuple2<Date,String>> cls=null;
 List<Tuple2<Date,String>> books=em.createQuery("select new io.vavr.Tuple2(date,title) from Book where publicationdate > '2008-01-01'",cls).getResultList();

上面的代码可以编译,但显然会因空指针异常而崩溃。

如果我对擦除的理解是正确的,那么只要我获得Class对象的实例,这将一直有效,因为所有泛型类型信息无论如何都会在运行时丢失。

有什么办法可以获取可以分配给变量cls的Class实例,以便此代码起作用?

1 个答案:

答案 0 :(得分:0)

基于@Thomas在第一篇文章中的评论,我提出以下内容。

虽然死了似乎不是一种实例化此类Class对象的方法,但可以通过子类实现相对可读的解决方案。

在代码所在的类中,在任何函数之外添加

public static class DateStringPair extends Pair<Date,String>{
      public DateStringPair(Date d,String s){super(d,s);}
}

然后呼叫变为

List<DateStringPair> books=em.createQuery(
        "select new com.example.ConnectionAndQueryTest$DateStringPair(publicationDate,title) from Book where publicationDate > '2008-01-01'"
    ,DateStringPair.class).getResultList( );

这有一个限制,那就是Pair类不能是最终的。

尽管在查询的可读性方面不如完全泛型支持那么灵活,但可以保持查询的方便。