Если бы у меня была следующая иерархия типов 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,_]]