簡體   English   中英

Java 8 Hibernate Streams Criteria groupingBy 擦除類型?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM