簡體   English   中英

關於mixin的類型參數的推斷

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM