[英]Inference of type parameters on mixins
比方說我有一些特點:
trait A[T] { def foo: T }
擴展它的類:
class B[T](t: T) extends A[T] { def foo = t }
父母特質的一個子特征:
trait C[T] extends A[T]
我想把C和B混在一起。
val foo = new B("foo") with C[String]
這樣可以正常工作,但我不需要再次指定類型參數,因為B已經是A [String]類型。 但是,我認為Scala不支持以下內容:
val foo = new B("foo") with C
我的問題是類型系統中有一些其他機制支持在混合C時不必指定類型參數。我想到的是如下內容:
trait C {
self: A[T] => ...
}
人們會認為這種事情可以解決C可能混入的問題。 但是,Scala無效。 就像是:
trait C {
type T
self: A[T] =>
}
也不起作用。
這個怎么樣:
scala> trait C {
| self: A[_] =>
| }
defined trait C
scala> val foo = new B("foo") with C
foo: B[String] with C = $anon$1@f2df380
scala> foo.foo
res16: String = foo
您可以使用抽象類型執行此操作:
trait A {
type AT
def foo: AT
}
class B[T](t: T) extends A {
type AT = T
def foo = t
}
trait C extends A
val foo = new B("foo") with C
定義有點冗長,但是您不必再次輸入T
要求就滿足了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.