我正在使用nscala-time(Joda Time的包装器)和一个项目的光滑。我正在尝试使用此子句为数据库写一行:
Article.insert(0,"title1", "hellothere", DateTime.now.getMillis.asInstanceOf[Timestamp])
显然Slick不支持在Joda Time中定义的“dateTime”类型,我必须使用java.sql.Timestamp
。所以我决定在insert
方法中使用“asInstanceOf”进行一点转换。不幸的是,Scala很快告诉我Java.Long无法转换为Java.sql.Timestamp。然后我用了这个:
val dateTime = new DateTime();
val timeStamp = new Timestamp(dateTime.getMillis());
Article.insert(0,"title1", "hellothere", timeStamp)
这神奇地起作用,而我所留下的只是混乱。
如何将其转换为一种方式而不是另一种方式?我应该使用与asInstanceOf
不同的转换吗?
答案 0 :(得分:6)
您误解了asInstanceOf
的作用: asInstanceOf
不会转换任何内容。它对编译器的作用是谎言,告诉它相信某些东西,而不是依赖它拥有的知识。
所以,你有一个Long
,然后你得到一个Long
,但假装它是一个Timestamp
,这显然不起作用。
我对asInstanceOf
提出了一个简单的建议:永远不要使用它。
答案 1 :(得分:2)
没有任何魔力。你的第一个陈述:
DateTime.now.getMillis
是Long
。长期不是Timestamp
,因此您无法使用asInstanceOf
将其转换为一个。
第二个陈述:
new Timestamp(dateTime.getMillis())
使用Timestamp
构造函数根据dateTime.getMillis
创建新的Timestamp实例。