加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何保存TypeTag,然后再使用它将类型重新附加到Any(Scala 2.10)

发布时间:2020-12-16 09:27:51 所属栏目:安全 来源:网络整理
导读:我正在尝试制作自定义异构列表和地图.虽然有使用Manifest的例子,但是Scala 2.10它们已被弃用,我应该使用TypeTags(或Classtags).在映射的情况下,似乎我可以使用(比如)元组String-(TypeTag [_lt ;: Any],Any)保持Any与Type的绑定. 我的问题是如何从恢复的TypeT
我正在尝试制作自定义异构列表和地图.虽然有使用Manifest的例子,但是Scala 2.10它们已被弃用,我应该使用TypeTags(或Classtags).在映射的情况下,似乎我可以使用(比如)元组String->(TypeTag [_&lt ;: Any],Any)保持Any与Type的绑定.

我的问题是如何从恢复的TypeTag和未定义的T中获取,以便能够返回TypeTag.tpe的实例 – 在我所拥有的代码中
????// **如何在这里使用保存的typeTag来定义T?**

如上所述,方法get中没有编译器错误,但是T设置为Nothing并返回Some(Nothing).我希望我的注释掉的线能够工作:
??????case Some(x)=> // println(“Get 2 *’pi’=”x * 2)其中有一个编译器消息,“value *不是Nothing的成员”.
我意识到我可以更紧凑地编写,但完成之后,我可以在我的IDE中鼠标悬停并按照一步一步进行操作.有一个相关的问题 – Scala: What is a TypeTag and how do I use it?但它似乎没有走“最后一英里” – 重新推出一个Any.

这个怎么做?

这是我到目前为止的代码:

import scala.reflect._
import scala.reflect.runtime.universe._
import collection.mutable.Map

object Test extends HMap {

  def main( args: Array[ String ] ) {

    var hmap = new HMap
    hmap( "anInt" ) = 1
    hmap( "pi" ) = 3.1416f
    hmap( "c" ) = "hello"
    // Test
    val result = hmap.get( "pi" )
    result match {
      case Some( x ) =>
        println( "Get 'pi'=" + x*2 )
      case _ =>
    }
  }
}

class HMap {
  private var coreMap = 
    Map.empty[ String,( TypeTag[ _ <: Any ],Any ) ]

  // Save the type tag with the value
  def update[ T: TypeTag ]( key: String,value: T ) = 
    coreMap.put( key,( typeTag[ T ],value ) )

  override def toString = coreMap.toString

  def get[ T: TypeTag ]( key: String ): Option[ T ] = {
    val option = coreMap.get( key )
    val result = option match {
      case None => None
      case Some( x ) => {
        val typeTag = x._1; val value = x._2
        println( "Matched Type = " + 
            typeTag.tpe + "   Value=" + value )
        // **** How do I use saved typeTag to define T here? ****
        val v = value.asInstanceOf[ T ]
        val s = Some( v )
        println( "Returning " + s )
        s
      }
    }
    result
  }
}

解决方法

这是我自己的答案:我不需要TypeTags,我真的不需要键控类型或元组.只是简单的泛型似乎做.我不需要比赛& case类枚举Any的可能值.只是一个简单的名称 – 值对映射.然后我使用它访问它
????hmap.get Float …. println(“Get’pi’=”x * 2)

只需调用:hmap.get Float,这似乎是合理且可读的.在编译时不检查类型,因此如果我要求错误的类型,我将得到运行时错误.如果我决定过滤类型,那么有一个地方可以做到.我应该检查可转换性并让Option返回None,如果它不能完成,而不是现在的Exception.
对我来说,上面是整洁的&因为所有的错误处理都可以在get中而不是使用:
?????hmap.get( “PI”).asInstanceOf [浮点].

谢谢你的帮助!

这是现在更简单的代码:

import collection.mutable.Map

object Test extends HMap {

  def main( args: Array[ String ] ) {

    var hmap = new HMap
    hmap( "anInt" ) = 1
    hmap( "pi" ) = 3.1416f
    hmap( "c" ) = "hello"
    // Test
    val result = hmap.get[ Float]( "pi" )
    result match {
      case Some( x ) =>
        println( "Get 'pi'=" + x * 2 )
      case _ => println("Not found")
    }
  }
}

class HMap {
  private var coreMap =
    Map.empty[ String,Any ]

  // Save the key with the value
  def update[ T ]( key: String,value: T ) =
    coreMap.put( key,value )

  def get[ T ]( key: String ): Option[ T ] = {
    val option = coreMap.get( key )
    option match {
      case None      => None
      case Some( x ) => Some( x.asInstanceOf[ T ] )
    }
  }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读