Scala F-ограниченный полиморфизм на объекте

Я не могу написать следующий F-ограниченный полиморфизм в Scala. Зачем?

trait X[T <: X[T]]
object Y extends X[Y]

Как я могу выразить это и заставить его скомпилировать?

2 ответа

Решение

Похоже, ты должен уметь писать,

trait X[T <: X[T]]
object Y extends X[Y.type]

однако, если вы попытаетесь, компилятор выдаст вам бесполезную (и я думаю, что ложную) ошибку,

scala> object Y extends X[Y.type]
<console>:16: error: illegal cyclic reference involving object Y
       object Y extends X[Y.type]

Я говорю "ложный", потому что мы можем построить эквивалентный объект с небольшой дополнительной инфраструктурой,

trait X[T <: X[T]]

trait Fix { type Ytype >: Y.type <: Y.type; object Y extends X[Ytype] }
object Fix extends Fix { type Ytype = Y.type }
import Fix.Y

Если вы хотите поэкспериментировать с этим в реальном коде, используйте объект пакета вместо object Fix сделал бы эту идиому немного более удобной.

Измените это на:

  trait Y extends X[Y]

object это не тип в Scala, а так называемый объект-компаньон. Определяя object YВы не можете выразить, что это должно распространяться trait T[Y]с той секунды Y относится к типу Y это не было определено. Однако вы можете сделать следующее:

trait Y extends X[Y]          //If you try this on the REPL, do :paste before
object Y extends X[Y]

В этом случае объект Y продолжается X[Y] где вторая Y - это черта, которую вы только что определили, убедитесь, что вы помните об этом.

Другие вопросы по тегам