Stellen Sie sich ein Merkmal wie folgt (bitte beachten Sie, dass ich zu illustrativen Zwecken dieses Merkmal nur bin mit meiner Frage stellen):Implizite Sicht (T) => T garantiert?
trait GetString[T, U] {
def toString(u: U): String = u.toString
final def getString(t: T)(implicit f: (T) => U) = toString(f(t))
}
und einige konkrete Implementierungen, bei denen T
und U
vom gleichen Typ sind, wie :
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
Jetzt ist hier, eine Implementierung, bei T
und U
unterscheiden:
object BooleanToString extends GetString[Boolean, Int]
scala> BooleanToString.getString(true)
<console>:13: error: No implicit view available from Boolean => Int.
Natürlich kann ich dieses Problem beheben, indem sie ein implizites hinzufügen:
implicit val bool2Int = (bool: Boolean) => if (bool) 1 else 0
scala> BooleanToString.getString(true)
res5: String = 1
Wenn T
und U
sind vom gleichen Typ, gibt es eine implizite Ansicht sein, immer gewährleistet? Mit anderen Worten, muss ich nur meine eigene implizite Umwandlung bereitstellen, wenn sich T
und U
unterscheiden?