想象一下如下特征(请注意我只是出于说明目的使用此特性来提出我的问题):
trait GetString[T, U] {
def toString(u: U): String = u.toString
final def getString(t: T)(implicit f: (T) => U) = toString(f(t))
}
以及T
和U
属于同一类型的一些具体实现,例如:
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
现在,这是T
和U
不同的实现:
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
如果T
和U
属于同一类型,是否始终保证是隐式视图?换句话说,我只需提供自己的视图吗? T
和U
不同时隐式转换?
答案 0 :(得分:3)
是的,有。所有T => U
都存在隐含的T <: U
。这包括T
和U
相同的情况。换句话说,总是存在对相同类型或超类型的隐式强制转换。
此视图在implicit def $conforms[A]: A <:< A
对象中定义为scala.Predef
。