2015-04-05 5 views
1

я получил метод Scala с этой подписью:Как я могу предотвратить функцию Scala получить «нуль» в качестве аргумента

def m (map: Map [String, _]) 

Я полагаю, Карта представляет собой тип ссылки и как таковые, я могу позвонить m прохождение null

m (null) // Allowed call 

есть ли способ, чтобы компилятор не позволяет null это некоторые вызовы методов? Другие языки, такие как Kotlin, позволяют это, явно указывая, что параметр может быть нулевым: http://kotlinlang.org/docs/reference/null-safety.html

В Scala есть что-то подобное?

EDIT: Благодарим вас за комментарии. Я понимаю, что ссылки «null» являются временем выполнения, но другие языки с другими типами систем заботятся об этом во время компиляции.

Я только хотел узнать, был ли способ и в Скала (я начинаю использовать этот язык). Проверка комментариев, ответ и Scala type hierachy Я гость не могу.

Для объектов значений (например, неизменяемых коллекций и классов классов) может возникнуть смысл избегать «null» (однако они распространяются AnyRef).

Я мог бы попытаться избежать «null», но, например, Map.get возвращает «null», если ключ не найден, поэтому я должен обработать это.

Что касается Map[String, _], это разнородная карта, подумайте об этом как о объекте JSON. Могу ли я справиться с этим другим, более похожим на Скала образом?

Спасибо!

+0

Это невозможно со стандартным компилятором и не работает с плагином компилятора. Маркерная черта 'NotNull' устарела с 2.11. Btw, работающий с '_' как тип значения карты, не помогает безопасному типу. – cchantep

+0

'null' существует в Scala для Java-взаимодействия. Мы вообще притворяемся, что этого не существует, потому что это принципиально нарушено. Просто никогда не пропускайте «ник» нигде. –

ответ

4

Любой тип ссылки (AnyRef) может, по определению виртуальной машины Java, быть null, и компилятор не может обеспечить, что ни на стороне клиента не вызывает вашу функцию с null.

Я настоятельно рекомендую не использовать null значения при работе с Scala. Если вам нужно обрабатывать отсутствующие значения, используйте вместо этого тип Option.