首页 > 解决方案 > 从 Int 定义隐式转换

问题描述

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

这是我的功能

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 原始整数。这是我的测试:

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

标签: scalatypestype-conversion

解决方案


如果您正确声明返回类型,则它编译得很好:

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

您的代码没有编译,因为您的返回类型fromContentDatabasePrimitive[Int]而不是DatabaseInt. 因此,您要么必须调整 的返回类型,要么调整andfromContent的类型。要求一个特定的,同时返回一个泛型是行不通的。val xval zDatabaseIntDatabasePrimitive[Int]


推荐阅读