我想要完成的是类似的事情:
class Foo( val bar: String = "Hello!" ) extends MyTrait[ Foo ]
trait MyTrait[ T ] { self : T =>
T.bar
}
改变自我:T改为自我:Foo显然有效,但MyTrait可能扩展另一个也有bar的类,所以self:Foo是不可接受的。
我可能会犯这个错误,有什么想法吗?
答案 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]
^