1

私は次の Scala コードを持っています。それをデバッグし、メソッドcreateObjectの機能を確認すると、すべて問題ないことがわかりますが、例外が発生します。

java.lang.IllegalArgumentException: wrong number of arguments
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)

インラインconstructor.newInstance(convertedArguments).asInstanceOf[T]

object ObjectFactory {
  def runTest() = {
    val container = createContainer("n1 | 1 | true")
    container.created
  }

  def createContainer(s: String): Container = {
    createObject(classOf[Container], s)
  }

  def createObject[T](cls: Class[T], line: String): T = {
    // we assume the classes first non-zero
    // argument constructor is the one we need :)
    val constructor = cls.getConstructors.filter(_.getParameterTypes.length > 0)(0)
    var ptypes = constructor.getParameterTypes

    val tokens: Array[String] = line.split("\\|", -1)
    val convertedArguments = tokens.zip(ptypes).collect {
      case Tuple2(value: String, propType: Class[_]) => convert(value.trim, propType)
    }.collect {
      case Some(o) => o
      case None    => null
    }

    constructor.newInstance(convertedArguments).asInstanceOf[T]
  }

  private def convert[T](input: String, outputClass: Class[T]): Option[T] = {
    if (outputClass == classOf[Date]) {
      Some(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.S").parse(input).asInstanceOf[T])
    } else if (outputClass == classOf[BigDecimal]) {
      Some(BigDecimal.apply(input).asInstanceOf[T])
    }
    else {
        if (input == null || ("" == input) || ("null" == input))
          None
        else
          Some(outputClass.getConstructor(classOf[String]).newInstance(input))
    }
  }
}

class Container(val name: String, val score: Integer, val created: String)

ここで何が起きてるの?コードをより scala に似たものに修正するにはどうすればよいでしょうか? 特に型変換の部分です。

4

1 に答える 1

2

メソッドは ではなくnewInstancevarargs ( AnyRef*)を取りますArray[Any]。1 つの引数でコンストラクターを呼び出そうとしています - Array

に変換Array[Any]してからArray[AnyRef]、特別な構文でメソッドを呼び出す必要があります: _*

constructor.newInstance(convertedArguments.map{_.asInstanceOf[AnyRef]}: _*)
于 2013-06-26T07:38:21.187 に答える