Re: Система типов
От: dimgel Россия https://github.com/dimgel
Дата: 02.12.14 11:33
Оценка:
Здравствуйте, _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 не настолько дружу.
Отредактировано 02.12.2014 11:44 dimgel . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.