Scala - корен на йерархията на ковариантния тип

Следният клас на 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 няма поддръжка за това?

Благодаря предварително!


person Learner    schedule 17.06.2011    source източник
comment
Можете да пропуснете точката и запетаята; можете също да пропуснете празни скоби на конструкторите.   -  person ziggystar    schedule 17.06.2011


Отговори (1)


Какво ще кажете за Foo[_ <: Foo[_]]? Което, между другото, споменах в отговора си на другия ви въпрос. Или можете да го напишете така:

type Base = Foo[t] forSome { type t <: Foo[t] }
person Daniel C. Sobral    schedule 17.06.2011
comment
Е, това там го пропуснах. Извинявам се. Това е добър отговор, на който се надявах. Благодаря! - person Learner; 17.06.2011