繁体   English   中英

如何在Scala中初始化Type变量?

[英]How to initialize variable of Type in Scala?

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

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的变量?

if-else表达式 ,而不仅仅是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])意味着类型B的值b可以向下转换为b.asInstanceOf[A] ,而不是相反。 如果classOf[URL].isAssignableFrom(tag.runtimeClass) ,则允许您将Type的值转换为URL而不是相反

此外,如果将参数Type限制为Type >: Null ,则代码将起作用。

大概是这样的:

 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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM