2015-11-12 6 views
3

Может ли быть какой-либо способ в scala, чтобы определить тип self для класса case, как в «классе любого класса»? Я хотел бы тип self, чтобы иметь возможность использовать метод .copy класса case, применяя его собственный тип: класс case не является обычным классом. Структурные типы, я думаю, не помогут, поскольку они требуют подписи, содержащей конкретные аргументы (я, вероятно, не может быть структурно-типичным для любого класса классов).может сам тип scala принудительно ввести тип класса case

Пожалуйста, откажитесь от «если вам нужно, чтобы вы что-то делали неправильно», поскольку я уже перешел, но мой дизайн api - был бы более гладким, если бы это было возможно. Мне также любопытно в следующий раз.

ответ

3

Это будет работать только с использованием (как вы полагаете) структурных типов, а также только для фиксированной известной последовательности аргументов класса case (вам нужна точная подпись copy). Например:

trait InCase[Repr] { 
    self: { def copy(foo: Int): Repr } => 

    def test(foo: Int): Repr = copy(foo) 
} 

case class Fail(foo: Int, bar: String) extends InCase[Fail] //illegal inheritance 

case class Succeed(foo: Int) extends InCase[Succeed] 

Succeed(123).test(456) 
+0

Да, именно поэтому я считаю, структурные типы не будет работать ... – matanster

+0

Хорошо знать, что я был близок, хотя;) – matanster