Следният клас на Scala:
class Foo[+T <: Bar] extends FooBase ...
ефективно дефинира йерархия на типове, която има Foo[Bar] като корен - т.е. всеки валиден Foo[X] ще може да бъде присвоен на Foo[Bar] стойност или променлива:
val v1: Foo[Bar] = new Foo[SubBar1]();
val v2: Foo[Bar] = new Foo[SubBar2]();
FooBase е по-нагоре и може също да означава обекти, които не са Foo - следното показва проблема:
class Trouble extends FooBase ...
val iOnlyWantFooHere: FooBase = new Trouble();
... и също така FooBase не познава тип T, така че членовете му не могат да го посочат и ще трябва да отменя тези дефиниции във Foo, за да ги специализирам:
class FooBase {
def ohNoIDontKnowTheType: Bar;
}
class Foo[+T <: Bar] extends FooBase {
override def ohNoIDontKnowTheType: T = ...;
}
Има и други начини за заобикаляне на този проблем, но въпросът трябва да е ясен.
И накрая, действителният ми въпрос е какъв е коренът на следната йерархия:
class Foo[+T <: Foo[T]] extends FooBase ...
Отново, не ми казвайте FooBase, защото това не е така. Да, бих могъл да вмъкна друг клас между тях специално за целта, но това все още не е верен отговор, както е посочено по-горе.
Scala не харесва само Foo
(без параметъра тип) и не е Foo[_]
, тъй като тогава методите за достъп, връщащи стойността на типа параметър на типа, всъщност ще бъдат Any
, а не Foo
. Разбира се, не можем да направим и Foo[Foo]
, тъй като тук също липсва параметърът тип за втория и Foo[Foo[_]]
или Foo[Foo[Foo[Foo[_]]]
ни дава само толкова много нива.
Има ли изобщо отговор или Scala няма поддръжка за това?
Благодаря предварително!