2017-10-08 4 views
3

Wie im folgenden Code.Was bedeutet "T =: = Int = null" in Scala?

class A[T] { 
    def add(n: Int)(implicit env: T =:= Int = null): Int = n + 1 
} 

object A extends App { 
    val a = new A[Int] 
    a.add(1) // 2 
} 

Ich weiß, dass T =:= Int bedeutet TInt vom Typ sein sollte, aber was bedeutet = null Teil bedeuten?


Hinweis: Das Beispiel ist von mir aus. Es wäre besser, wenn Sie mir eine ordnungsgemäße Verwendung von zeigen könnten, wenn es nicht angemessen ist.

Antwort

6

null ordnet dem ev nur einen Standardwert zu, genau wie bei jedem anderen Parameter. Es ist ein kluger Weg, um herauszufinden, ob der Typ tatsächlich ein Int ist:

def isInt[T](implicit ev: T =:= Int = null): Boolean = env != null 

isInt[Int] // true 
isInt[String] // false 

Der Trick besteht darin, dass, wenn Compiler die Int sieht, ist es in dem aktuellen impliziten Wert übergeben wird, und wenn es nicht finden kann, Eins, es wird es als Standard verlassen. Wenn Sie also überprüfen, ob evnull ist, können Sie feststellen, ob das Implizit an der Call-Site verfügbar war.

+0

Also verschiebt es den 'Int' Test von der Kompilierzeit zur Laufzeit? Klingt wie etwas zu vermeiden. – jwvh

+0

@jwvh, nicht der Test selbst. Sehen Sie, der "Test" ist die Suche nach einem impliziten, wenn kein Wert angegeben wird. In Dimas Fall ist "durchführen" überhaupt kein Test. – pedrofurla

+3

@jwvh gewährt, es ist nicht sehr "Mainstream", aber es gibt einige legitime Anwendungen für ... Besonders wenn Sie weniger strenge Einschränkungen als '=: =' verwenden. Zum Beispiel: 'def foo [T] (bar: T) (implizit ev: T <: Dima