Почему мы можем использовать новый класс как тип родительского класса в Scala? - PullRequest
2 голосов
/ 23 мая 2019

В упрощенной реализации Actor в RedBook они используют очередь на основе узлов MPSC для Actor. Они определяют узел по этой строке кода:

private class Node[A](var a: A = null.asInstanceOf[A]) extends AtomicReference[Node[A]]

Но как мы можем использовать Node[A] в качестве параметра типа AtomicReference, потому что у нас еще нет class Node[A]? Это способ объявления рекурсивного типа в Scala?

1 Ответ

8 голосов
/ 23 мая 2019

Вы можете использовать рекурсию в определении класса / черты:

abstract class Example[A] extends (A => Example[A])

def example(prefix: String): Example[String] = new Example[String] {
  def apply(s: String): Example[String] = {
    val t = prefix + s
    println(t)
    example(t)
  }
}

example("1")("2")("3") 
//12
//123

Если у вас есть X extends F[X], то в итоге вы получили что-то, известное разработчикам C ++ как с любопытным повторяющимся шаблоном и в теории типов в целом как F-ограниченные типы .

Вы можете найти его даже в Java, потому что каждый enum X находится под abstract class X extends Enum[X].

...