如何保存TypeTag,然后再使用它将类型重新附加到Any(Scala 2.10)
我正在尝试制作自定义异构列表和地图.虽然有使用Manifest的例子,但是Scala 2.10它们已被弃用,我应该使用TypeTags(或Classtags).在映射的情况下,似乎我可以使用(比如)元组String->(TypeTag [_< ;: Any],Any)保持Any与Type的绑定.
我的问题是如何从恢复的TypeTag和未定义的T中获取,以便能够返回TypeTag.tpe的实例 – 在我所拥有的代码中 如上所述,方法get中没有编译器错误,但是T设置为Nothing并返回Some(Nothing).我希望我的注释掉的线能够工作: 这个怎么做? 这是我到目前为止的代码: 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. 谢谢你的帮助! 这是现在更简单的代码: 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 ] ) } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |