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 首先没有通用类型信息。
我想更多地参与 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 首先没有通用类型信息。