55

I'm tearing my hair out trying to figure out how to do the following:

def foo(msf: String, o: Any, os: Any*) = {
    println( String.format(msf, o :: List(os:_*)) )
}

There's a reason why I have to declare the method with an o and an os Seq separately. Basically, I end up with the format method called with a single object parameter (of type List ). Attempting:

def foo(msf: String, o: Any, os: Any*) = {
    println( String.format(msf, (o :: List(os:_*))).toArray )
}

Gives me the type error:

found: Array[Any]

required Seq[java.lang.Object]

I've tried casting, which compiles but fails for pretty much the same reason as the first example. When I try

println(String.format(msg, (o :: List(os:_*)) :_* ))

this fails to compile with implicit conversion ambiguity (any2ArrowAssoc and any2stringadd)

2 Answers 2

67
def foo(msf: String, o: AnyRef, os: AnyRef*) = 
  println( String.format(msf, (o :: os.toList).toArray : _* ))
Sign up to request clarification or add additional context in comments.

6 Comments

It compiles but falls over at runtime: Exception in thread "main" java.lang.ClassCastException: scala.$colon$colon cannot be cast to scala.runtime.BoxedObjectArray at scala.runtime.RichString.format(RichString.scala:242)
Also, where does toList come from?
Fixed, it works now. I'm filing a bug report - Scala shouldn't have ClassCastExceptions except when you have used asInstanceOf. toList is a method on Iterable[A]
Apparently it's been fixed in the 2.8 branch lampsvn.epfl.ch/trac/scala/ticket/1360
Why was toArray necessary, though? List is a valid input to : _*.
|
13
def foo(msf: String, o: AnyRef, os: AnyRef*) =
  println( String.format(msf, o :: os.toList : _* ) )

or

def foo(msf: String, o: AnyRef, os: AnyRef*) =
      println( msf format (o :: os.toList : _* ) )

I much prefer the latter, though it has no locale* support.

  • Scala 2.8 does have locale support with RichString's format.

1 Comment

Using the RichString format method is what I opted for in the end

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.