0

次のようなジェネリック型があるとします。

class GenericEchoer[T <: Any] {
    var content: T = _
    def echo: String = "Echo: " + content.toString
}

次に、次のように GenericEchoer[T] の機能を拡張できる mixin を作成できます。

trait Substitution[T <: AnyRef] extends GenericEchoer[T] {
    def substitute(newValue: T) = { content = newValue }
}

これらを定義したら、次の方法で型をインスタンス化できます。

val echoer = new GenericEchoer[Int] with Substitution[Int]

私の質問は、ミックスインで型パラメーターを省略できるように、同様の機能を実装する方法ですか? つまり、次の行で同じ型をインスタンス化できるようにしたいと考えています。

val echoer = new GenericEchoer[Int] with Substitution

ただし、置換は基になる型パラメーターを「認識しない」ため、これは機能しません。

4

1 に答える 1

2

あなたのコードは間違っています。コンパイルすらできません。

メンバーが抽象的であるため、 にGenericEchoerすることはできません。または、これをデフォルト値で初期化する必要があります。classcontent

class GenericEchoer[T <: AnyRef] {
    var content: T = _
    def echo: String = "Echo: " + T.toString
}

あなたは書くことができませんT.toString、私はあなたが望んでいたと思いますcontent.toString。それに渡すことはできませんInt。原因IntAnyValそのスーパータイプとして has であり、上限Tは ですAnyRef

self.contentinSubstitutionも違法です。次のことを行う必要があります。

1)selfセルフタイプとして作成:

trait Substitution[T <: AnyRef] extends GenericEchoer[T] { self =>
    def substitute(newValue: T) = { self.content = newValue }
}

2) this 3) そのままにしておきます{ content = newValue }

あなたの問題について。いいえ、できません。型コンストラクターを抽象型メンバーに置き換えることclassをお勧めします。trait

trait GenericEchoer {
  type T <: AnyRef  
  var content: T = _
  def echo: String = "Echo: " + content.toString
}

trait Substitution extends GenericEchoer {
  def substitute(newValue: T) { content = newValue }
}

val enchoer = new GenericEchoer with Substitution { type T = String }

またはそれ以上

val enchoer = new GenericEchoer with Substitution { 
  type T = String 
  var content = "Hello" // either case it will be null
}
于 2013-10-19T12:27:33.990 に答える