Может ли параметр типа Scala ссылаться на себя при использовании в качестве параметра для базового класса?

Если бы у меня была следующая иерархия типов Scala:

// Base traits
trait TA[X <: TA[X,Y], Y <: TB[X,Y]]
trait TB[X <: TA[X,Y], Y <: TB[X,Y]]
trait TC[X <: TA[X,_]]

// More specific traits
trait TI[X <: TI[X,Y], Y <: TJ[X,Y]] extends TA[X,Y]
trait TJ[X <: TI[X,Y], Y <: TJ[X,Y]] extends TB[X,Y]
trait TK[X <: TI[X,_]] extends TC[X]

// Concrete class that should implement TK, but does not compile
class Z extends TK[TI[_,_]]

// What is needed to be able to get class Z to compile
// The reference of X to itself has been removed.
trait TC2[X <: TA[_,_]]
trait TK2[X <: TI[_,_]] extends TC2[X]
class Z2 extends TK2[TI[_,_]]

TC был бы общим менеджером некоторого вида TA.

TK был бы более конкретным менеджером более конкретного TA (TI).

Z будет конкретной реализацией, которая управляет любым объектом, реализующим TI.

Z не является законным, но Z2 разрешено. К сожалению, TC и TK более специфичны, чем TC2 и TK2. Так есть ли способ объявить Z с помощью TC и TK вместо TC2 и TK2?

[РЕДАКТИРОВАТЬ] В своем первоначальном вопросе я не сказал, что я вроде как понимаю, почему Z не работает. Я действительно хочу знать, есть ли способ сказать что-то вроде:

class Z3 extends TK[TI[TI,_]]
6
задан Sebastien Diot 27 August 2011 в 15:44
поделиться