你能指定一个抽象类型的视图?

时间:2012-02-27 17:37:13

标签: scala

my answerthis question,我对以下代码不起作用感到惊讶。

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

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

OP表示用类型参数替换抽象类型不是一种选择。有没有办法表达一个抽象类型的视图?

1 个答案:

答案 0 :(得分:7)

肯定有。类型参数上的视图绑定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]]
}