我開始使用後端使用Hibernate(JPA)的Scala應用程序。爲了加載一個對象,我使用下面這行代碼:scala的通用對象加載函數
val addr = s.load(classOf[Address], addr_id).asInstanceOf[Address];
不用說,這有點痛苦。我寫了一個輔助類,它是這樣的:
import org.hibernate.Session
class DataLoader(s: Session) {
def loadAddress(id: Long): Address = {
return s.load(classOf[Address], id).asInstanceOf[Address];
}
...
}
所以,現在我可以這樣做:
val dl = new DataLoader(s)
val addr = dl loadAddress(addr_id)
這裏的問題:我如何寫一個可以加載任何一個通用的參數化方法使用相同模式的對象?即
val addr = dl load[Address](addr_id)
(或類似的規定。)
我是新來斯卡拉所以請原諒這裏任何東西,是特別可怕的。
@丹尼爾 - 你的asInstance演員陣容恐怕不是很安全。考慮兩個語句'val a = load [Address](1)'和'val b:Any = load [Address](2)''的情況。在第二種情況下,實際上不會發生對Address類的強制轉換(它們被擦除),並且您相信Hibernate會實際返回一個正確類型的實例(公平地說,它肯定會)。 – 2010-03-13 14:05:46
@oxbow我明白了。你的觀點是,'Class.cast'會在'load'內引起運行時錯誤,而不是留下一些可能會在以後引起麻煩的事情? – 2010-03-13 21:22:49
是的 - 就是這樣。在這裏進行的唯一「正確」轉換是在load方法之外,並由編譯器插入,因爲引用「a」的類型是Address。如果調用'load'方法並將其分配給'Any',那麼不會發生CCE,並且您可能會發現某行發生了什麼事情。 – 2010-03-14 12:35:36