ฉันเป็นมือใหม่ที่ใช้ Hibernate และฉันกำลังเขียนวิธีง่ายๆในการส่งคืนรายการวัตถุที่ตรงกับตัวกรองเฉพาะ List<Foo>
ดูเหมือนเป็นประเภทผลตอบแทนตามธรรมชาติ
สิ่งที่ผมทำผมไม่สามารถดูเหมือนจะทำให้มีความสุขคอมไพเลอร์, @SuppressWarnings
ถ้าฉันจ้างน่าเกลียด
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
public class Foo {
public Session acquireSession() {
// All DB opening, connection etc. removed,
// since the problem is in compilation, not at runtime.
return null;
}
@SuppressWarnings("unchecked") /* <----- */
public List<Foo> activeObjects() {
Session s = acquireSession();
Query q = s.createQuery("from foo where active");
return (List<Foo>) q.list();
}
}
ฉันต้องการที่จะกำจัดสิ่งSuppressWarnings
นั้น แต่ถ้าฉันทำฉันจะได้รับคำเตือน
Warning: Unchecked cast from List to List<Foo>
(ฉันสามารถเพิกเฉยได้ แต่ฉันไม่ต้องการรับตั้งแต่แรก) และหากฉันลบสามัญเพื่อให้สอดคล้องกับ.list()
ประเภทการส่งคืนฉันจะได้รับคำเตือน
Warning: List is a raw type. References to generic type List<E>
should be parameterized.
ผมสังเกตเห็นว่าorg.hibernate.mapping
ไม่ประกาศList
; แต่เป็นประเภทที่แตกต่างกันโดยสิ้นเชิง - Query
ส่งคืน a java.util.List
เป็นประเภทดิบ ฉันคิดว่ามันแปลกที่ Hibernate (4.0.x) ล่าสุดจะไม่ใช้ประเภทที่กำหนดพารามิเตอร์ดังนั้นฉันจึงสงสัยว่าเป็นฉันแทนที่จะทำอะไรผิด
ดูเหมือนผลลัพธ์ Cast Hibernate ในรายการวัตถุแต่ที่นี่ฉันไม่มีข้อผิดพลาด "ยาก" (ระบบรู้จักประเภท Foo และฉันไม่ได้ใช้ SQLQuery แต่เป็นการสืบค้นแบบตรง) ดังนั้นไม่มีความสุข
ฉันได้ดูHibernate Class Cast Exception ด้วยเนื่องจากมันดูมีแนวโน้ม แต่แล้วฉันก็รู้ว่าฉันไม่ได้รับอะไรเลยException
... ปัญหาของฉันเป็นเพียงคำเตือน - รูปแบบการเข้ารหัสถ้าคุณต้องการ
เอกสารใน jboss.org คู่มือไฮเบอร์เนตและแบบฝึกหัดต่างๆดูเหมือนจะไม่ครอบคลุมหัวข้อในรายละเอียดดังกล่าว (หรือฉันไม่ได้ค้นหาในสถานที่ที่ถูกต้อง?) เมื่อลงรายละเอียดแล้วพวกเขาจะใช้การแคสต์แบบทันที - และนี่คือบทช่วยสอนที่ไม่ได้อยู่ในเว็บไซต์ jboss.org อย่างเป็นทางการดังนั้นฉันจึงระมัดระวังเล็กน้อย
รหัสเมื่อรวบรวมแล้วทำงานโดยไม่มีปัญหาชัดเจน ... ที่ฉันรู้ ... แต่; และผลลัพธ์คือสิ่งที่คาดหวัง
ฉันทำแบบนี้ใช่ไหม ฉันขาดอะไรบางอย่างที่ชัดเจนหรือไม่? คือมี "อย่างเป็นทางการ" หรือ "แนะนำ" วิธีที่จะทำ ?