隐式视图(T)=> T保证吗?

时间:2017-07-01 19:05:50

标签: scala

想象一下如下特征(请注意我只是出于说明目的使用此特性来提出我的问题):

trait GetString[T, U] {
  def toString(u: U): String = u.toString
  final def getString(t: T)(implicit f: (T) => U) = toString(f(t))
}

以及TU属于同一类型的一些具体实现,例如:

object LongToString extends GetString[Long, Long]
object DoubleToString extends GetString[Double, Double]

scala> LongToString.getString(100L)
res2: String = 100

scala> DoubleToString.getString(29.3)
res3: String = 29.3

现在,这是TU不同的实现:

object BooleanToString extends GetString[Boolean, Int]

scala> BooleanToString.getString(true)
<console>:13: error: No implicit view available from Boolean => Int.

当然,我可以通过添加隐含的方式来解决这个问题:

implicit val bool2Int = (bool: Boolean) => if (bool) 1 else 0
scala> BooleanToString.getString(true)
res5: String = 1

如果TU属于同一类型,是否始终保证是隐式视图?换句话说,我只需提供自己的视图吗? TU不同时隐式转换?

1 个答案:

答案 0 :(得分:3)

是的,有。所有T => U都存在隐含的T <: U。这包括TU相同的情况。换句话说,总是存在对相同类型或超类型的隐式强制转换。

此视图在implicit def $conforms[A]: A <:< A对象中定义为scala.Predef