Подтвердить что ты не робот

Тип результата неявного преобразования должен быть более конкретным, чем AnyRef

Пусть

def h(a: AnyRef*) = a.mkString(",")
h: (a: AnyRef*)String

и поэтому

h("1","2")
res: String = 1,2

Однако h(1,2)

error: the result type of an implicit conversion must be more specific than AnyRef
              h(1,2)
                ^
error: the result type of an implicit conversion must be more specific than AnyRef
              h(1,2)
                  ^

Это, по крайней мере, в Scala 2.11.1 и 2.11.1. Просить обходной путь.

4b9b3361

Ответ 1

Вы можете воспроизвести проблему просто:

val x: AnyRef = 42

Здесь соответствующий запрос на github, который ввел изменение

Обоснование заключается в том, что по соображениям безопасности некоторые неявные преобразования явно отключены, а именно, когда преобразование идет от T до U, отключено, если:

T <: Null

или

AnyRef <: U

В вашем конкретном случае это означает, что Int (который не является AnyRef) никогда не будет преобразован в AnyRef.

Если вам нужно принять как Int, так и String, вы можете принять вместо этого Any. Поскольку каждый объект scala наследуется от Any, не требуется никакого неявного преобразования.

def h(a: Any*) = a.mkString(",")

Ответ 2

Причина в том, что числовой тип литералов 1 и 2 Int, который расширяет AnyVal, который, в свою очередь, расширяет Any. С другой стороны, String расширяет AnyRef, что, в свою очередь, продолжается Any. Итак, вы можете видеть, что AnyVal (Int parent) не расширяет AnyRef. Вы можете решить это одним из двух способов.

Первый из них меняет тип от AnyRef до Any, как описано Nate.

Во втором используется титра для литералов 1 и 2, так что они рассматриваются типа java.lang.Integer, который расширяет java.lang.Object. Также обратите внимание, что AnyRef является просто псевдонимом для java.lang.Object. Итак, используя ваше определение, должно работать следующее:

scala> h(1: java.lang.Integer, 2: java.lang.Integer)
res2: String = 1,2

Дополнительная информация о Scala Иерархия

Ответ 3

Я не думаю, что вы хотите использовать AnyRef здесь. Я думаю, вы хотите Any.

scala> def h(a: Any*) = a.mkString(",")
h: (a: Any*)String

scala> h(1,2)
res0: String = 1,2

Причина в том, что числовое значение 5 - это Int, но AnyRef эквивалентно java Object. Поэтому, чтобы вызвать этот метод, он должен быть java.util.Integer.