Невозможно создать кортеж с нулем в Scala - PullRequest
4 голосов
/ 19 октября 2011

Следующий код не компилируется:

var next: (A, A) = (null, n)

Ошибка:

error: type mismatch;
found   : Null(null)
required: A
var next: (A, A) = (null, n)

Также var next: (A, A) = ((null: A), n) завершается с той же ошибкой.

Каким-то образом я думаю, что он должен скомпилироваться.

В настоящее время я использую следующий код, который, кажется, работает:

var next: (A, A) = (null.asInstanceOf[A], n)

Почему это не работает? Баг или фича?

Редактировать

После прочтения ответа Дидье проблема очевидна. Я пропустил, что null можно назначить только для AnyRef типов. Для моей проблемы я выбираю сделать кортеж (n,n) и иметь логический флаг, действительна ли первая запись. В зависимости от приложения Option может быть лучшим решением.

Ответы [ 5 ]

12 голосов
/ 19 октября 2011

Возможно, потому что тип вашего параметра A не гарантированно равен <: AnyRef.Должен, если вы намерены передать NULL.Если это так, я бы сказал, что функция </p>

Изменить .См. Комментарий Дэниела ниже, решение>: Null, см. Также ответ AgileSteel.

6 голосов
/ 19 октября 2011

Дидьер прав. Если вы в состоянии убедиться, что A <: AnyRef или A >: Null это сработает.

scala> def createTuple[A >: Null](first: A, second: A) = (first, second)
createTuple: [A >: Null](first: A, second: A)(A, A)

scala> val next = creatTuple(null, "n")
next: (java.lang.String, java.lang.String) = (null,n)
6 голосов
/ 19 октября 2011

Я не уверен, что вы пытаетесь заархивировать, используя null s (за исключением большего количества NPE во время выполнения), но я могу рекомендовать вам не использовать null в вашем коде Scala. Scala имеет тип Option, который можно использовать вместо null. Так что в вашем случае это будет выглядеть так:

var next: (Option[A], A) = (None, n)

Я нахожу этот код намного более понятным, и его большое преимущество заключается в том, что тип кортежа сообщает другим людям (и компилятору), что его первый элемент не какой-то A, а либо Some[A], либо None. * 1011. *

Если вам нужно интегрировать с существующим кодом Java, который использует null, вы можете как можно скорее обернуть объекты, поступающие со стороны Java, в опцию. Вы можете сделать это так:

var next: (Option[A], A) = (Option(getAFromSomeMethodThatCanReturnNull()), n)

Этот ответ, вероятно, не отвечает на ваш первоначальный вопрос, но я надеюсь, что он будет как-то полезен.

0 голосов
/ 25 апреля 2015

Я только что столкнулся с этой проблемой; в функции с универсальным типом [A] мне нужно использовать кортеж типа (List[A], A).

следующие строительные работы: (Nil, null.asInstanceOf[A]). Работает для Scala 2.10 и 2.11.

0 голосов
/ 19 октября 2011

Для быстрого решения в REPL вы можете опустить объявление типа:

scala> var next = ((null: A), n)
next: (A, A) = (null,A@a9de5c)

scala> def foo (pa : (A, A)) { println ("unit") }
foo: (pa: (A, A))Unit

scala> foo (next) 
unit

Тем не менее, я бы тоже предложил использовать Option.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...