Тип результата неявного преобразования должен быть более конкретным, чем 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.
Просить обходной путь.
Ответы
Ответ 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.