Hibernate中的所有API都是1.4,因此不使用java泛型。
所以我想知道以下是多么“安全”:(前提条件:name列是数据类型String,或者至少与String兼容)
@SuppressWarnings("unchecked")
public List<String> getAll() {
Query q = session.createQuery(
"select name from Customers");
return q.list();
}
来自Queryi API(org.hibernate.Query.list())javadoc。
答案 0 :(得分:3)
Java泛型使用类型擦除,因此在运行时,List
,List<String>
和List<Integer>
之间没有区别。一切都只是List
。在编译时,编译器将强制执行模板参数类型,但在运行时的封面下,您有一个List
。
实际上,如果您尝试使用反射来查找模板参数类型,则不能。
答案 1 :(得分:3)
只要您确定查询“不包含每行多个结果”,它就会安全。 (我不熟悉查询,因此我不确定在这种情况下是否会发生这种情况。)如果一行确实包含多个结果,那么当您尝试访问它时,它将在运行时抛出ClassCastException,因为该元素将是一个Object []对象而不是String对象。
答案 2 :(得分:2)
在Java中,泛型实际上是擦除,这只不过是编译魔术。用作泛型类型参数的类型在运行时是未知的。因此,如果返回的列表实现了List接口,则转换应该成功,但编译器可能会向您发出警告。