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ます。