Java 8 Hibernate Streams Criteria groupingBy erasure 类型?

Java 8 Hibernate Streams Criteria groupingBy erasure type?

我想更多地参与 Java 8 美丽 && 精彩 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));    
}

但是出现编译错误:

 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));    
}

我的问题是我是否已经知道 Hibernate 返回的集合类型

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));    
}

或者说不可能?

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

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

最好的变体是将 List 分配给 List<Student> 的变体,因为这里 unchecked 操作就发生在API 通过将 Criteria.list() 的结果从 List 转换为 List<Student> 来强制您这样做。然后,所有后续操作都可以执行类型安全(假设您断言列表包含 Student 实例是正确的)。

注意这与类型擦除无关,只是原始类型使用。没有要擦除的类型信息,因为 Criterion class 首先没有通用类型信息。