Scala 使用typetags匹配java重载的vararg方法,通过Try映射
我有一个重载的java方法调用,可以采用String或InetAddress vararg参数。为了降低复杂性,我想在调用java方法之前将字符串序列转换为InetAddresses序列。在将字符串转换为InetAddress时,我只希望允许有效值 看到后,我想到:Scala 使用typetags匹配java重载的vararg方法,通过Try映射,scala,Scala,我有一个重载的java方法调用,可以采用String或InetAddress vararg参数。为了降低复杂性,我想在调用java方法之前将字符串序列转换为InetAddresses序列。在将字符串转换为InetAddress时,我只希望允许有效值 看到后,我想到: import scala.reflect.runtime.universe._ import java.net.InetAddress import scala.util.Try type InetAddr = java.net.
import scala.reflect.runtime.universe._
import java.net.InetAddress
import scala.util.Try
type InetAddr = java.net.InetAddress
def tryMap[A](xs: Seq[Try[A]]) =
Try(Some(xs.map(_.get))).
getOrElse(None)
def toInet(address: String): Try[InetAddr] = {
Try(InetAddress.getByName(address))
}
def stringToInet[A: TypeTag](xs: Seq[A]): Option[Seq[InetAddr]] = typeOf[A] match {
case t if t =:= typeOf[String] => tryMap(xs.map(toInet)).getOrElse(None)
case t if t =:= typeOf[InetAddr] => Some(xs)
case _ => None
}
但是我得到了错误
<console>:18: error: type mismatch;
found : String => scala.util.Try[InetAddr]
required: A => ?
case t if t =:= typeOf[String] => tryMap(xs.map(toInet)).getOrElse(None)
:18:错误:类型不匹配;
找到:String=>scala.util.Try[InetAddr]
必需:A=>?
如果t=:=typeOf[String]=>tryMap(xs.map(toInet)).getOrElse(None),则为案例t
我不确定我是否即将获得可行或偏离正轨的东西,并希望在找到解决方案时得到一些指导。问题是,即使您知道类型标记等于您想要的类型,也不会改变
xs
的类型,因此您需要这样做:
import scala.reflect.runtime.universe._
import java.net.InetAddress
import scala.util.Try
def tryMap[A](xs: Seq[Try[A]]) =
Try(Some(xs.map(_.get))).
getOrElse(None)
def toInet(address: String): Try[InetAddress] = {
Try(InetAddress.getByName(address))
}
def stringToInet[A: TypeTag](xs: Seq[A]): Option[Seq[InetAddress]] = typeOf[A] match {
case t if t =:= typeOf[String] =>
tryMap(xs.asInstanceOf[Seq[String]].map(toInet)) // don't need the getOrElse, it's already an option
case t if t =:= typeOf[InetAddress] =>
Some(xs.asInstanceOf[Seq[InetAddress]])
case _ => None
}
asInstanceOf
有点难看,但却是做你想做的事情所必需的