![](/img/trans.png)
[英]Implicit conversion between Scala.Long and Java.lang.Long in collections
[英]Scala implicit Long to Serializable
我想在春季使用Scala的Long
AbstractPersistable<PK extends Serializable>
通过使用隐式。
以下示例/测试无法编译:
class A[+T]
object Helper {
implicit def sLong(l: scala.Long): java.io.Serializable = scala.Long.box(l)
val a: A[java.io.Serializable] = new A[Long]
}
并返回
Error:(18, 36) type mismatch;
found : com.kiga.db.A[Long]
required: com.kiga.db.A[java.io.Serializable]
val a: A[java.io.Serializable] = new A[Long]
更新1:
原来是
implicit def sl(l: A[Long]): A[java.io.Serializable] = new A[java.io.Serializable]
可以解决问题,但是从AbstractPersistable的代码进行的Scala转换是错误的。 它应该是:
abstract class AbstractPersistable[PK <: java.io.Serializable]
我想实现以下目标:
class ScalaPersistable extends AbstractPersistable[scala.Long]
隐式不会使scala.Long
扩展Serializable
。 您可以使用java.lang.Long
或创建类似的类
case class SerializableLong(x: Long) extends Serializable
object SerializableLong {
implicit def longToSLong(x: Long) = SerializableLong(x)
implicit def sLongToLong(x: SerializableLong) = x.x
}
您的隐式从Long转换为java.io.Serializable,并且您需要从A [Long]转换为A [java.io.Serializable]的隐式
所以结合两个答案。 就像Alexey所说的那样,您不能通过隐式转换将接口实现添加到类中,您应该使用一些包装器来实现序列化和Long
值的访问。
正如哈维尔所说,基础类型之间的转换并不意味着容器类型之间的转换。 对于这种转换,您的类型应提供类似Functor的界面
例如,您可以这样定义您的类型
class A[+T] {
def map[U](implicit f: T => U): A[U] = ???
}
现在有
val a = new A[Long]
您可以使用这种方法
val jA: A[java.lang.Long] = a.map
val sA: A[SerializableLong] = a.map
从Alexey的答案转换而来的SerializableLong
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.