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 - это черта, которую вы только что определили, убедитесь, что вы помните об этом.