2010-03-19 6 views
4

Je veux faire une classe qui accepte tout ce qui est commandé et imprime plus. (Je suis en train d'apprendre donc je sais qu'il est un peu inutile)paramètre étend une classe

class PrinterOfGreater[T extends Ordered](val a:T, val b:T){println(a > b)} 

Je sais que ce ne peut pas être écrit par ce style SCALA, mais je ne sais pas comment écrire correctement ... Est-ce que quelqu'un sait?

et pourquoi cela ne compile pas? Lactosérum l'emballage de chaîne est Ordonné

class PrinterOfGreater[T <: Ordered[T]](a:T, b:T){println(a > b)} 
object A extends Application{new PrinterOfGreater("abc","abd")} 

Répondre

6

En ce qui concerne votre deuxième question: String (qui Scala est juste java.lang.String, au moins lors du ciblage Java/plate-forme de machine virtuelle Java) ne définit pas l'opérateur relationnel >. Cependant, vous pouvez adapter facilement en remplaçant le <: avec <% qui spécifie un soi-disant vue lié, ce qui signifie que dans A <% BA est soit un sous-type de B ou qu'il ya une conversion implicite portée qui donnera un B quand donné un A.

Cela fonctionne pour String car la bibliothèque standard de Scala fournissent une conversion implicite de chaîne à RichString (à Scala 2.7) ou StringOps (à Scala 2.8) où les opérateurs relationnels sont définis.

4

Vous voulez

class PrinterOfGreater[T <: Ordered[T]](val a:T, val b:T){println(a > b)} 

<: signifie « est une sous-classe de » (comme extends le fait en Java), et Ordered est lui-même paramétrées, et vous voulez être Décidez que vous essayez de comparer T, donc vous spécifiez Ordered[T].

Questions connexes