параметр расширяет класс - PullRequest
5 голосов
/ 19 марта 2010

Я хочу сделать класс, который принимает все заказанные и печатает больше.(Я только учусь, поэтому знаю, что это немного бесполезно)

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

Я знаю, что этот стиль не может быть написан в scala, но я не знаю, как правильно его написать... Кто-нибудь знает?

и почему это не компилируется?Сыворотка-обертка заказана

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

Ответы [ 2 ]

6 голосов
/ 19 марта 2010

Относительно вашего второго вопроса: String (который в Scala равен просто java.lang.String, по крайней мере, при нацеливании на платформу Java / JVM) не определяет реляционный оператор >.Однако вы можете легко справиться с этим, заменив <: на <%, который задает так называемый границы представления , что означает, что в A <% B A есть подтип B иличто существует неявное преобразование в области видимости, которое даст B при получении A.

. Это работает для String, поскольку стандартные библиотеки Scala предоставляют неявное преобразование из String в RichString (вScala 2.7) или StringOps (в Scala 2.8), где определены реляционные операторы .

4 голосов
/ 19 марта 2010

Вы хотите

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

<: означает «является подклассом» (точно так же, как extends в Java), а сам Ordered параметризован, и вы хотите прояснить, что вы пытаетесь сравнить T, поэтому Вы указываете Ordered[T].

...