[英]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返回的集合類型,如果返回類型Criteria.list()
被聲明為原始類型List
中,無類型參數,編譯器不知道。
無論您使用哪種方法,它都至少涉及一個未經檢查的操作。
最好的變體是您將List
分配給List<Student>
的變體,因為這里未經檢查的操作發生在 API 強制您執行它的位置,通過從List
轉換Criteria.list()
的結果到List<Student>
。 然后,所有后續操作都可以執行類型安全(假設您對列表包含Student
實例的斷言是正確的)。
請注意,這與類型擦除無關,僅與原始類型的使用有關。 沒有要擦除的類型信息,因為Criterion
類首先沒有通用類型信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.