2017-07-01 4 views
1

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?

Antwort

3

Ja, gibt es. Implizit T => U existiert für alle T <: U. Dies beinhaltet den Fall, dass T und U identisch sind. Mit anderen Worten, es gibt immer eine implizite Umwandlung in den gleichen Typ oder Supertyp.

Diese Ansicht ist definiert als implicit def $conforms[A]: A <:< A im Objekt scala.Predef.

Verwandte Themen