Hier (siehe gist):
Schritt 1: Enc oding A zu erfassen ist kein Subtyp von B
trait NotSubTypeOf[A, B]
Hinweis: Wir können Infixschreibweise verwenden A NotSubTypeOf B
statt schreiben von NotSubTypeOf[A, B]
Schritt 2: Der Nachweis für zwei beliebigen beliebigen Typen A und B, A nicht ist ein Subtyp von B
implicit def isSub[A, B]: A NotSubTypeOf B = null
Schritt 3: mehrdeutige implicits definieren Fehler im Fall A auszulösen kompilieren ist ein Subtyp von B (oder A =: = B)
Schritt 4: Definieren Sie eine type-lambda für die Negation Typ:
type Not[T] = {
type L[U] = U NotSubTypeOf T
}
Mit kind-projector kann dies viel besser lesbar gemacht werden.
Schritt 5: Fertig!
def iDontLikeStrings[A: Not[String]#L](a: A) = {
println(a)
}
iDontLikeStrings(23) // compiles
iDontLikeStrings(true) // compiles
//iDontLikeStrings("hello") // does not compile
Die Compiler Fehlermeldung für die letzte Zeile in Scala 2.12, die SI-6806 Adressen besser gemacht werden.
Auch all dies ist in Shapeless integriert.
Nur neugierig, können Sie ein praktisches Beispiel dafür geben, wann Sie das verwenden würden? –
Kaum jemals - der Negationstyp ist ein winziger Schritt über 'Any' :) – pathikrit
Nicht sicher, es ist sogar ein Schritt - Unendlichkeit minus Eins ist immer noch unendlich! –