Scala абстрактный тип, представляющий тип подкласса - PullRequest
6 голосов
/ 29 июля 2011

Я ищу способ определить метод, который возвращает тип T, где T = тип подкласса.

Я знаю, что я мог бы сделать это, используя абстрактные типы, но мне не нравятся издержкинеобходимость переопределения T для каждого подкласса.

Пример кода:

object Helper {
  def help[A <: MyClass](cls: A): Option[A] = { cls.foo() map { _.asInstanceOf[A] } }
}

class MyClass {
  type T <: MyClass
  def foo(): Option[T] = Some(this.asInstanceOf[T])
}

class ChildClass extends MyClass {
   type T = ChildClass
}

Возможно, новая языковая функция облегчила эту задачу?Или я могу использовать this.type каким-то образом?Для меня важно, чтобы я мог определить вспомогательный класс, который может вызывать foo таким образом.

Ответы [ 3 ]

3 голосов
/ 29 июля 2011

Если вы всегда возвращаете this, тогда вы действительно можете иметь тип возврата this.type. Или вы уже пробовали это?

this.type особенно полезно, например, когда вы хотите связать вызовы с одним и тем же объектом или предоставить статическую гарантию, что вы будете возвращать один и тот же объект (а не копию). Например, Buffer s в Scala имеют операцию добавления :+, которая возвращает Buffer[A], и +=, которая возвращает this.type. Первый дублирует изменчивую последовательность; последний гарантирует, что вы обновите исходный объект.

2 голосов
/ 29 июля 2011

Я нашел следующую идиому полезной:

class MyClass[T] {
  self: T => 
  def foo(): Option[T] = Some(this)
}

class ChildClass extends MyClass[ChildClass]

new ChildClass().foo()
//--> Option[ChildClass] = Some(ChildClass@2487b1)
2 голосов
/ 29 июля 2011

Чтобы проконтролировать ответ Жан-Филиппа, который написал его именно тогда, когда я пишу свой, вот код:

trait SomeTrait {
  def foo: this.type = this
}

class UsesTrait extends SomeTrait

object Main {
  def main(args: Array[String]) {
    println((new UsesTrait).foo) // prints UsesTrait@<hash value>
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...