Можете ли вы указать границы представления для абстрактного типа? - PullRequest
3 голосов
/ 27 февраля 2012

В моем ответе на этот вопрос , я был удивлен, что следующий код не работает.

scala> abstract class Foo {
     |  type Repr_Tpe <% Ordered[Repr_Tpe]
     | }

<console>:2: error: `=', `>:', or `<:' expected

ОП говорит, что замена абстрактнойТип с параметром типа не вариант.Есть ли способ выразить представление, привязанное к абстрактному типу?

1 Ответ

7 голосов
/ 27 февраля 2012

Конечно, есть.Граница представления A <% B для параметра типа является просто сахаром для «параметра неявного значения с типом A => B».Таким образом, вы хотите сказать, что:

abstract class Foo {
    type Repr_Tpe
    implicit def orderify: (Repr_Tpe => Ordered[Repr_Tpe])
}

Конечно, реализации должны будут обеспечивать фактическую реализацию orderify в то же время, когда они указывают тип.Возможно что-то вроде

class Bar extends Foo {
    type Repr_Tpe = Int
    val orderify = implicitly[Int => Ordered[Int]]
}

или

class Baz[A <% Ordered[A]] extends Foo {
    type Repr_Tpe = A
    val orderify = implicitly[A => Ordered[A]]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...