Здравствуйте, _NN_, Вы писали:
_NN>Есть ли система типов, которая позволяет переопределить M<U> как U в наследнике ?
_NN>Например имея Nullable<int> в базовом классе , наследник мог бы определить int , тем самым усиливая условия и удовлетворяя требованием базового.
В скале есть весьма узкоприменимый marker trait NotNull:
scala> class C1
defined class C1
scala> class C2 extends C1 with NotNull
defined class C2
scala> val c1: C1 = null
c: C1 = null
scala> val c2: C2 = null
<console>:9: error: type mismatch;
found : Null(null)
required: C2
val c2: C2 = null
scala> val c2: C2 = c1
<console>:10: error: type mismatch;
found : C1
required: C2
val c2: C2 = c1
^ ^
Узкоприменимость его заключается в следующем... упс, пофиксили оказывается давно уже!
scala> def f(s: String with NotNull) {}
f: (s: String with NotNull)Unit
scala> f("hello")
scala> f(null)
<console>:9: error: type mismatch;
found : Null(null)
required: String with NotNull
f(null)
^
Раньше на строковый литерал ругалось, что мол null это.
_NN>Ну и далее в общем случае имея скажем List<U> определить в наследнике U или явно пустой список.
Можно что-нибудь через implicit conversion замутить наверное. С ходу впрочем не нарисую: я с implicits не настолько дружу.