Я не мог найти ответа на этот вопрос ни в одном другом вопросе. Предположим, что у меня есть абстрактный суперкласс Abstract0 с двумя подклассами Concrete1 и Concrete1. Я хочу иметь возможность определить в Abstract0 что-то вроде
def setOption(...): Self = {...}
, где Self будет конкретным подтипом. Это позволило бы объединять вызовы setOption следующим образом:
val obj = new Concrete1.setOption(...).setOption(...)
и по-прежнему получать Concrete1 в качестве предполагаемого типа obj.
Что я не делаю ' Я хочу определить это:
abstract class Abstract0[T <: Abstract0[T]]
, потому что это усложняет клиентам работу с этим типом. Я пробовал различные возможности, включая абстрактный тип:
abstract class Abstract0 {
type Self <: Abstract0
}
class Concrete1 extends Abstract0 {
type Self = Concrete1
}
, но тогда невозможно реализовать setOption, потому что this
в Abstract0 не имеет типа Self. При использовании это: Self =>
также не работает в Abstract0.
Какие есть решения этой проблемы?