Заморозить мозг по следующим вопросам:
abstract class A {
def withName(name: String): this.type
}
case class B(name: String) extends A {
def withName(name: String): this.type = copy(name = name.reverse)
}
case class C(name: String) extends A {
def withName(name: String): this.type = copy(name = name.toLowerCase)
}
В основном я хочу, чтобы методы в B и C возвращали тот же тип, что и они сами.
2 ответа
Конечно, вы также можете использовать члены типа для того же:
abstract class A {
type R <: A
def withName(name: String): R
}
case class B(name: String) extends A {
type R = B
def withName(name: String): R = copy(name = name.reverse)
}
Два возможных решения:
В ролях:
abstract class A {
def withName(name: String): this.type
}
case class B(name: String) extends A {
def withName(name: String): this.type = copy(name = name.reverse).asInstanceOf[this.type]
}
case class C(name: String) extends A {
def withName(name: String): this.type = copy(name = name.toLowerCase).asInstanceOf[this.type]
}
F-ограниченный полиморфизм:
abstract class A[T <: A[_]] {
def withName(name: String): T
}
case class B(name: String) extends A[B] {
def withName(name: String): B = copy(name = name.reverse)
}
case class C(name: String) extends A[C] {
def withName(name: String): C = copy(name = name.toLowerCase)
}
this.type
означает «тип этого единственного экземпляра», поэтому единственно правильное решение — вернуть this
. Но здесь вы возвращаете другой экземпляр, а затем разыгрываете его, эффективно притворяясь, что это то же самое insatance, когда это не так.
Похожие вопросы
Новые вопросы
scala
Scala - это язык программирования общего назначения, в основном предназначенный для виртуальной машины Java. Разработанный для краткого, элегантного и безопасного для типов представления общих шаблонов программирования, он сочетает в себе как императивный, так и функциональный стили программирования. Его ключевые особенности: продвинутая система статического типа с выводом типа; типы функций; сопоставления с образцом ; неявные параметры и преобразования; перегрузка оператора; полная совместимость с Java; совпадение
withName
, ваша подпись не имеет смысла. По своей сигнатуре (тип возвратаthis.type
)withName
может возвращать только себя, ноwithName
при этом должен менять имя. Своего рода уловка-22.