Result type of an implicit conversion must be more specific than AnyRef

后端 未结 4 591
遇见更好的自我
遇见更好的自我 2020-11-29 09:12

Let

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

and so

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

H

4条回答
  •  一生所求
    2020-11-29 09:42

    The reason is that the numeric type of the literals 1 and 2 is Int which extends AnyVal which, in turn, extends Any. On the other hand String extends AnyRef which, in turn, extends Any. So as you can see AnyVal (Int's parent) does not extend AnyRef. You can solve this in one of two ways.

    The first one is changing the type from AnyRef to Any as described by Nate.

    The second one is using a type ascription for the literals 1 and 2 so that they are considered of type java.lang.Integer which extends java.lang.Object. Note also that AnyRef is just an alias for java.lang.Object. So, using your definition the following should work:

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

    More info on Scala Hierarchy

提交回复
热议问题