从Int定义隐式转换

时间:2018-06-14 09:03:59

标签: scala types type-conversion

我正在尝试定义从scala int到自定义数据类型的隐式转换。

以下是我的功能

object DatabaseInt extends ImplicitConverter [Int]{

    implicit def fromContent(content: Integer): DatabasePrimitive[Int] = DatabaseInt(content)

    override implicit def fromContent(content: Int): DatabasePrimitive[Int] = DatabaseInt(content)

    override implicit def toContent(el: DatabasePrimitive[Int]): Int = el.getContent
}

这似乎只适用于scala原始int。这是我的测试:

 val x: DatabaseInt = 3 //does not work
 val y: DatabaseInt = Int(3) //does work
 val z: DatabaseInt = Integer.valueOf(3) //does not work

1 个答案:

答案 0 :(得分:2)

如果你正确地声明了返回类型,它编译得很好:

import scala.language.implicitConversions

trait DatabasePrimitive[A] {
  def getContent: A
}
case class DatabaseInt(i: Int) extends DatabasePrimitive[Int] {
  def getContent = i
}

object DatabaseInt {
    implicit def fromContent(content: Integer): DatabaseInt = DatabaseInt(content)
    implicit def fromContent(content: Int): DatabaseInt = DatabaseInt(content)
    implicit def toContent(el: DatabasePrimitive[Int]): Int = el.getContent
}


 val x: DatabaseInt = 3 // works
 val z: DatabaseInt = Integer.valueOf(3) // works

您的代码未编译,因为fromContent的返回类型为DatabasePrimitive[Int]而不是DatabaseInt。因此,您必须调整fromContent的返回类型,或val xval z的类型。要求特定DatabaseInt,同时返回通用DatabasePrimitive[Int]不起作用。