是否可以将特征的上下文更改为声明为其类型参数的类型?

时间:2012-02-24 15:21:06

标签: scala traits

我想要完成的是类似的事情:

class Foo( val bar: String = "Hello!" ) extends MyTrait[ Foo ]

trait MyTrait[ T ] { self : T =>
 T.bar
}

改变自我:T改为自我:Foo显然有效,但MyTrait可能扩展另一个也有bar的类,所以self:Foo是不可接受的。

我可能会犯这个错误,有什么想法吗?

2 个答案:

答案 0 :(得分:6)

我认为,结构类型就是你所需要的:

trait MyTrait {
  self: { val bar: String } =>
 def showBar = bar
}

class Foo(val bar: String) extends MyTrait

答案 1 :(得分:1)

它已经有效了。

scala> trait Foo[A] { self: A =>
     | }
defined trait Foo

scala> class Meh extends Foo[Meh]
defined class Meh

scala> class Duh extends Foo[Meh]
<console>:36: error: illegal inheritance;
 self-type Duh does not conform to Foo[Meh]'s selftype Foo[Meh] with Meh
       class Duh extends Foo[Meh]
                         ^

修改

对不起,我误解了这个问题。 @ 4e6是对的。你需要一种结构类型。他的解决方案略有不同:

scala> trait Foo[A <: { def bar: String }] { self: A =>
     | }
defined trait Foo

scala> class Bar extends Foo[Bar] {
     |   def bar = ""
     | }
defined class Bar

scala> class Baz extends Foo[Baz]
<console>:35: error: type arguments [Baz] do not conform to trait Foo's type parameter bounds [A <: AnyRef{def bar: Stri
ng}]
       class Baz extends Foo[Baz]
                         ^