我正在尝试使用HibernateTemplate.findByCriteria(条件)获取记录。
它正在返回List,我正在尝试将它转换为List,但它不允许我这样做。如何将列表转换为列表?
这是我的代码示例:
public List<User> getUserList(String status, String type)
{
DetachedCriteria joinCriteria = DetachedCriteria.forClass(UserDetails.class)
.add(Restrictions.eq("status", status));
DetachedCriteria criteria = joinCriteria.createCriteria("user")
.add(Restrictions.eq("type", type));
return (List<User>) template.findByCriteria(criteria); // Gives error "Cannot cast from List<Object> to List<User>"
}
答案 0 :(得分:1)
首先,正如您已经注意到的那样,Java不会将子类关系扩展到模板。这意味着,如果您有两个类A
和B
,其中B extends A
,那么C<B>
不是C<A>
的子类,这正是编译器的内容试图告诉你。 oracle documentation也会告诉你这个问题。即使&#34; hack&#34;与@ laurentiu-l相关联的作品,您可能想要考虑这种替代解决方案,这种解决方案稍微少一点&#34; hacky&#34;在我看来:
final List<User> returnValue = new LinkedList<>();
for(Object user : template.findByCriteria(criteria)) {
returnValue.add((User)user);
}
return returnValue;
关于Java为什么不将子类扩展到泛型的一些背景知识。假设它确实并考虑了以下三个类:
class Animal { }
class Dog extends Animal { }
class Cat extends Animal { }
现在我们编写以下代码:
List<Dog> dogList = new LinkedList<>();
// Perfectly fine, since Dog extends Animal
List<Animal> animalList = dogList;
// Fine again, since a Cat is an Animal, so we can put it in the list
animalList.add(new Cat());
// Oops...
Dog dog = dogList.get(0);
此代码可以完美编译,但在运行时抛出错误。为了避免这种并发症,Java完全禁止将这种子类型扩展到泛型。