2017-09-13 18 views
0

("id"->"1", "name"->"andre")のようなMap[String,String]をケースクラスUser(id:String,name:String)に変換する方法の例を見てきましたが、メソッドmapToUserを呼び出す - 例えば:暗黙のメソッドを使用して[[String、String]をケースクラスUser(id、name)にキャストする

val r = User.mapToUser(u.get) 
     println("information for " + r.name + " with id " + r.id) 

case class User(id: String, name: String) 

object User { 
    implicit def userToMap(user: User): Map[String, String] = { 
    Map("id" -> user.id, "name" -> user.name) 
    } 

    implicit def mapToUser(m: Map[String, String]) : User = { 
    User(m.get("id").get, m.get("name").get) 
    } 

    def unapply(arg: Map[String,String]): User = User(arg.get("id").get, arg.get("name").get) 
} 

ScalaはMap[String,String]Userの最初の暗黙的な変換を使用する方法についても理解することは、私はuserToMapを呼び出す必要はありませんしているが、それは、変換をやって失敗している理由を理解していませんたとえば var r = u.get.asInstanceOf[User]のようになります。それは、ユーザーに値をキャストすることはできませんと言う - 私はまた.to[User]を試してみましたが、それは

Error:(73, 24) User takes no type parameters, expected: one val r = u.get.to[User]

全コードの言葉:

import scredis._ 

import scala.concurrent.Future 
import scala.util.{Failure, Success} 

case class User(id: String, name: String) 

object User { 
    implicit def userToMap(user: User): Map[String, String] = { 
    Map("id" -> user.id, "name" -> user.name) 
    } 

    implicit def mapToUser(m: Map[String, String]) : User = { 
    User(m.get("id").get, m.get("name").get) 
    } 

    def unapply(arg: Map[String,String]): User = User(arg.get("id").get, arg.get("name").get) 
} 

object RedisClient { 

    val redis = new Redis(host="192.168.122.2", passwordOpt = Some("privatemachine")) 

    import redis.dispatcher 

    def save(key:String, x : User) : Unit = { 
    x.foreach { 
     f => redis.hSet(key, f._1, f._2).onComplete{ 
     case Success(content) => None 
     case Failure(e) => e.printStackTrace() 
     } 
    } 
    } 

    def get(key:String) : Future[Option[Map[String,String]]] = { 
    val result = redis.hGetAll(key) 

    result.onComplete { 
     case Success(content) => { 
     println(" --> " + content) 
     } 
     case Failure(e) => e.printStackTrace() 
    } 

    result 
    } 
} 

object Run extends App { 

    val redis = new Redis(host="192.168.122.2", passwordOpt = Some("privatemachine")) 

    import redis.dispatcher 


    redis.hSet("my-hash", "maker", "BMW") 

    redis.hGetAll("my-hash") onComplete { 
     case Success(content) => { 
     println(content) 
     } 
     case Failure(e) => e.printStackTrace() 
    } 

    val u1 = User("1", "andre") 
    RedisClient.save("user_1", u1) 

    val userResult = RedisClient.get("user_1") 
    userResult.map { 
    u => 
     //val r = User.mapToUser(u.get) 
     val r = u.get.to[User] 
     println("information for " + r.name + " with id " + r.id) 
    }.onFailure{ case x => println("Look here : " + x)} 

} 
+1

あなたは( '.TO [ユーザー]を')キャスト使用するべきではありません - ちょうどに明示的に 'r'のタイプを定義します'User'となり、暗黙の変換は' u.get'( 'Map [String、String]')を 'User'に変換することができます:' val r:User = u.get' –

+0

それは答えとしてこれをコミットする気になりますか? –

答えて

1

を明示的、暗黙的な方法のいずれかを呼び出す必要はありません、キャスティングを使用しないでください。暗黙的な変換は、一致する変換が与えられた別の型の変数/値にある型のインスタンスを割り当てることによって簡単に適用できます。次のように

は、だからあなたの場合には、これらの変換を使用することで行われます:

val map = Map("id" -> "1", "name" -> "2") 
val u: User = map // implicit conversion into User 
val m: Map[String, String] = u // implicit conversion back into Map 
関連する問題