Java 8 Hibernate流标准按擦除类型分组?

Java 8 Hibernate流标准按擦除类型分组?,java,hibernate,java-8,java-stream,type-erasure,Java,Hibernate,Java 8,Java Stream,Type Erasure,我一直在尝试更多地使用Java8漂亮和美妙的API 这是我的密码 private final Map<String,List<Student>>getStudentsAsStreamAndCollect() { final Criteria criteria = currentSession().createCriteria(Student.class) .setMaxResults(10); return (Map<Str

我一直在尝试更多地使用Java8漂亮和美妙的API

这是我的密码

private final Map<String,List<Student>>getStudentsAsStreamAndCollect()
{
    final Criteria criteria = currentSession().createCriteria(Student.class) 
    .setMaxResults(10);        
    return (Map<String,List<Student>>)criteria.list()
   .stream()
   .collect(Collectors.groupingBy(Student::getSingle));    
}
有一些方法可以做到:

private final Map<String,List<Student>>getStudentsAsStreamAndCollect()
{
    return currentSession().createCriteria(Student.class) 
    .setMaxResults(10);        
    .list()
   .stream()
   .collect(Collectors.groupingBy(Student::getSingle));    
}
私有最终映射GetStudentsStreamandCollect()
{
return currentSession().createCriteria(Student.class)
.setMaxResults(10);
.list()
.stream()
.collect(Collectors.groupingBy(Student::getSingle));
}
还是不可能

知道Hibernate返回的集合类型没有帮助,如果
Criteria.list()
的返回类型被声明为原始类型
list
,没有类型参数,编译器不知道

无论使用哪种方法,它都至少涉及一个未检查的操作

最好的变体是将
列表
分配给
列表
,因为在这里,未检查的操作正好发生在API强制您执行操作的点上,方法是将
Criteria.List()的结果从
列表
转换为
列表
。然后,可以执行类型安全的所有后续操作(假设您关于列表包含
Student
实例的断言是正确的)


请注意,这与类型擦除无关,只是关于原始类型的使用。由于
标准
类一开始没有泛型类型信息,因此没有可擦除的类型信息。

非常好地回答了criteria.list()怎么可能是标准;签名应该像是不是原始类型和类型参数只是为我的知识一样。createCriteria(类类型)、List或其他非常感谢的东西。如果
Criteria
是一个泛型类,则可以通过返回其
List()
方法的适当类型实例的方式声明
createCriteria
。然后,它工作顺利。请注意,您还可以通过强制转换每个元素来修复它:
criteria.list().stream().map(Student.class::cast)
 incompatibles types Object cannot be cast to Map<String,List<Student>>
private final Map<String,List<Student>>getStudentsAsStreamAndCollect()
{
    final List<Student> students = currentSession().createCriteria(Student.class) 
    .setMaxResults(10);        
    .list();
   students.stream()
   .collect(Collectors.groupingBy(Student::getSingle));    
}
currentSession().createCriteria(Student.class) 
private final Map<String,List<Student>>getStudentsAsStreamAndCollect()
{
    return currentSession().createCriteria(Student.class) 
    .setMaxResults(10);        
    .list()
   .stream()
   .collect(Collectors.groupingBy(Student::getSingle));    
}