0

我是scala的新手,很抱歉这个愚蠢的问题。我想从这个 Scala 代码中删除返回语句(我的实际情况比这复杂得多)

def readValue[Type](value: Any)(implicit tag: ClassTag[Type]): Type = {

    if (value == null) { 
      return null.asInstanceOf[Type] 
    } else {
      if (classOf[URL].isAssignableFrom(tag.runtimeClass)) {
        return new URL(value.toString).asInstanceOf[Type]
      }
      if (classOf[URI].isAssignableFrom(tag.runtimeClass)) {
        return new URI(value.toString).asInstanceOf[Type]
      }
      null.asInstanceOf[Type]
    }
}

这就是为什么我要存储 Type 实例的返回值,如下所示:

def readValue[Type](value: Any)(implicit tag: ClassTag[Type]): Type = {

    var retVal:Type = null
    if (value == null) { 
       // retVal=...
    } 
    else { 
       // if cond: retVal=...
    }
    retVal
}

上面的解决方案无法编译。我怎样才能为 type 初始化变量Type

4

2 回答 2

2

if-elses 是表达式,而不仅仅是scala 中的语句:

def readValue[Type](value: Any)(implicit tag: ClassTag[Type]): Type = {
    if (value == null) { 
      null.asInstanceOf[Type] 
    } else if (classOf[URL].isAssignableFrom(tag.runtimeClass)) {
      new URL(value.toString).asInstanceOf[Type]
    } else if (classOf[URI].isAssignableFrom(tag.runtimeClass)) {
      new URI(value.toString).asInstanceOf[Type]
    } else {
      null.asInstanceOf[Type]
    }
}

另请注意,这classOf[A].isAssignableFrom(classOf[B])意味着btype的值B可以向下转换为b.asInstanceOf[A],而不是相反。如果classOf[URL].isAssignableFrom(tag.runtimeClass), 那么您可以将类型的值强制Type转换为URL,而不是相反

此外,如果您将参数限制TypeType >: Null.

于 2018-07-20T13:41:00.833 回答
2

可能是这样的:

 Option(value)
   .map { _.toString }
   .map { v =>  tag.runtimeClass.getConstructor(v.getClass).newInstance(v) }
   .map { _.asInstanceOf[Type] }
   .orNull

或者,如果您希望避免反射,请执行以下操作:

val contructors: Map[Class[_], String => Any] = Map(
  classOf[URL] -> { s => new URL(s) }
  classOf[Uri] -> { s => new URI(s) }
}

Option(value)
 .map { _.toString }
 .map { constructors(tag.runtimeClass).apply(_) }
 .map { _.asInstanceOf[Type] }
 .orNull 
于 2018-07-20T15:33:17.973 回答