繁体   English   中英

Scala隐式从长到可序列化

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM