0

String または InetAddress vararg パラメータのいずれかを取ることができるオーバーロードされた Java メソッド呼び出しがあります。複雑さを軽減するために、Java メソッドを呼び出す前に、文字列のシーケンスを InetAddresses のシーケンスに変換したいと考えました。String を InetAddress に変換する際に、有効な値のみを許可したい

typetagでこれを見て、Tryでこれを見て、次のように思いつきました。

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)

実行可能なものに近づいているのか、軌道から大きく外れているのかはわかりません。解決策を見つけるためのガイダンスをいただければ幸いです。

4

1 に答える 1

0

問題は、 type タグが必要なタイプと等しいことがわかっていても、 のタイプが変更されないため、次の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やりたいことをするために必要です。

于 2013-07-04T01:47:15.610 に答える