На ум приходят два языка, которые поддерживают как объектно-ориентированную парадигму, так и ненулевые типы: (возможно) C ++ и (определенно) Spec # .
Spec # - это формальный язык для контрактов API (под влиянием JML, AsmL и Eiffel), который расширяет C # конструкциями для ненулевых типов, предусловий, постусловий и инвариантов объектов. - с домашней страницы Spec # на Microsoft Research
Последнее, вероятно, не широко используется (если вообще используется).Там вы получаете необнуляемый тип, добавляя суффикс к !
(например, object!
или string![]!
).
Что касается C ++, я уверен, что кто-то умный найдет множество аргументов, почему C ++ долженне упоминаться здесь;Будучи сложным, деликатным языком, я уверен, что такие причины существуют.Мой аргумент для упоминания C ++ в любом случае заключается в том, что помимо указателей (*
) (которые вполне могут быть 0
), C ++ также имеет ссылки (&
), которые должны быть инициализированы чем-то разумным.Основная проблема со ссылками, AFAIK, в том, что они не могут быть использованы для всего.Вероятно, есть определенные ситуации, например, с управлением памятью или умными указателями, когда вы не можете полностью избавиться от указателей.
Наконец, вы всегда можете попытаться создать свои собственные типы оберток, не допускающие значения NULL, например, в C #.Вероятно, как и многие другие, Джон Скит сделал это и написал об этом в блоге .Это работоспособное решение, но такой тип NotNull<T>
может показаться немного громоздким, поскольку он не совсем интегрирован в язык, как в Spec #.