有什么方法可以实例化一个类<;C<;A、 B>&燃气轮机;java中的对象?
我尝试在java中使用Hibernate和TypedQuery 我尝试调用的方法具有签名有什么方法可以实例化一个类<;C<;A、 B>&燃气轮机;java中的对象?,java,generics,type-erasure,Java,Generics,Type Erasure,我尝试在java中使用Hibernate和TypedQuery 我尝试调用的方法具有签名 <T> TypedQuery<T> createQuery(String qlString, Class<T> resultClass) TypedQuery createQuery(字符串qlString,类resultClass) 我想像bellow一样调用它,但是用一个实际实例替换null Class<Tuple2<Date,String>
<T> TypedQuery<T> createQuery(String qlString, Class<T> resultClass)
TypedQuery createQuery(字符串qlString,类resultClass)
我想像bellow一样调用它,但是用一个实际实例替换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=null;
List books=em.createQuery(“从publicationdate>'2008-01-01',cls.getResultList()中选择新io.vavr.Tuple2(日期,标题);
上面的代码经过编译,但显然带有空指针异常
如果我对擦除的理解是正确的,那么只要我得到类对象的一个实例,这就可以工作,因为所有泛型类型信息在运行时都会丢失
有没有什么方法可以得到一个类的实例,我可以把它分配给变量cls,这样代码就可以运行了?基于我第一篇文章上的@Thomas评论,我带了以下内容 虽然它似乎不是实例化此类类对象的一种方法,但通过子类化可以实现相对可读的解决方案 在代码所在的类中,在任何函数之外添加
public static class DateStringPair extends Pair<Date,String>{
public DateStringPair(Date d,String s){super(d,s);}
}
公共静态类DateStringPair扩展了数据对{
公共DateStringPair(日期d,字符串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( );
List book=em.createQuery(
“从publicationDate>'2008-01-01'所在的书中选择new com.example.connection和QueryTest$DateStringPair(publicationDate,title)”
getResultList();
这有一个限制,即Pair类不能是final
虽然查询的可读性不如完全泛型支持那么灵活,但是查询的可读性可以在没有太多麻烦的情况下得到维护。您可以使用
Tuple2.Class
而不是Class
。除此之外,没有Tuple2.class
只有Tuple2.class
。您可以创建一个类DateStringTuple extends Tuple2
,这样您就可以在createQuery()
@Thomas中直接使用DateStringTuple.class
,它不能解决问题,只会移动它。这样做会导致一个编译器错误:不兼容的类型:java.util.List无法转换为java.util.ListWell,第一部分不是关于解决方案,而是关于为什么您想要做的是不可能的。您可以使用原始类型(仅通过强制转换为列表
),但这不能确保返回的元组具有类型日期
和字符串
。最好使用自定义类进行特定查询,而不是为简单的“快速和肮脏”情况设计的通用元组,但如果您仍然想保持通用性,只需使用Tuple2.class,并将其转换为(Tuple2)。删除令人困惑的行“Class cls=null”;考虑使用更抽象的类型
。