Scala转换长整型为日期时间

3

我正在使用nscala-time(Joda Time的包装器)和slick来完成一个项目。我尝试使用以下语句将一行写入数据库:

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之外的其他转换方式吗?

2个回答

5
你误解了asInstanceOf的作用:asInstanceOf不会转换任何东西。它所做的是向编译器撒谎,告诉它相信某些东西而不是使用已有的知识。
因此,你有一个Long,然后你得到了一个Long,但假装它是一个Timestamp,这显然行不通。
关于asInstanceOf,我有一个简单的建议:永远不要使用它。

1
嗯,那么在Scala中,首选的类型转换方式是什么,还是有其他方法吗?(关于我的问题) - windweller
@WindDweller,除了在基本值类(IntDoubleChar等)上进行一些转换之外,实际上并没有任何类型转换。 要么源对象有一个方法将其转换为其他内容(例如 toInt),要么目标类型具有将源类型的对象作为参数的构造函数。 - Daniel C. Sobral

3

这并没有什么神奇的地方。你的第一句话:

DateTime.now.getMillis

这是一个Long。Long不是Timestamp,所以使用asInstanceOf无法将其转换为Timestamp。

第二个语句:

new Timestamp(dateTime.getMillis())

使用Timestamp构造函数基于dateTime.getMillis创建一个新的时间戳实例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接