Printer
フィルターを通過できない場合を除き、提供された引数を出力 する抽象クラス (これは類似の例です)があります。Printer
そのジェネリック型に対して反変T
です。
class Printer[-T] {
val filters: Seq[Function2[T => Boolean]]
def print(t: T): Unit {
if (filters.forall(_(t))) doPrint(t)
}
def doPrint(t: T): Unit
}
現在、20 個のサブクラスがありPrinter
ます。1 つは String、Int などPrinter
です。 は反変でfilters
あるため、val
. ただしPrinter
、フィルターを追加するメソッドが必要な場合は、不変である必要があります。
def addFilter[TT <: T](t: TT): Printer[TT]
残念ながら、20 個のサブクラスのそれぞれにこのメソッドを実装する必要があります。これを回避する方法はありますか?
更新: また、addFilter
では、スーパークラスの代わりにサブクラスを返す方法がわかりませんPrinter
。たとえば、 a を呼び出しaddFilter
た場合、StringPrinter
理想的には型を取得しStringPrinter
ます。