我开始使用后端使用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