在Scala中运行时有效类型转换covariant和contravariant类
发布时间:2020-12-16 08:47:19 所属栏目:安全 来源:网络整理
导读:我写了一个实现 command design pattern的类: class MyCommand[-T,+R](val name: String,val execute: T = R) ,准备两个命令并将其存储在MutableList中: val commands = new mutable.MutableList[MyCommand[Nothing,Any]]commands += new MyCommand[String
我写了一个实现
command design pattern的类:
class MyCommand[-T,+R](val name: String,val execute: T => R) ,准备两个命令并将其存储在MutableList中: val commands = new mutable.MutableList[MyCommand[Nothing,Any]] commands += new MyCommand[String,String]("lower",s => s.toLowerCase()) commands += new MyCommand[Date,Long]("time",d => d.getTime) 然后我有两个要执行的数据: val data = Array("StRiNG",new Date()) 对我来说问题是我不知道如何确定哪个数据适用于该命令: data.foreach { d => commands.foreach { c => // println(c.execute(d)) if d is applicable to c.execute(). } } 我尝试的是模式匹配与类型规范,但它产生语法错误: c.execute match { case m: (d.getClass => Any) => println(c.execute(d)) } 帮我 :( 解决方法
我很确定有更好的方法来解决这个问题,但这可能对你有用.我用Scala 2.9.2测试了它.
MyCommand将Manifest作为一个额外的隐式参数,它允许我们访问在运行时表示执行函数的from类型的类: class MyCommand[-T: Manifest,val execute: T => R) { val fromClass = manifest[T].erasure } 命令列表与原始帖子基本相同,数据列表也是如此: val commands = List( new MyCommand[String,_.toLowerCase()),new MyCommand[Date,_.getTime) ) val data = List("StRiNG",new Date()) 将数据匹配到命令依赖于所涉及类型的运行时表示形式,以及相当丑陋的演员表.演员阵容特别难看,因为它没有给出精确的返回类型,例如,如果您需要知道命令返回值的精确返回类型,则需要额外的匹配或强制转换. data foreach { d => commands foreach { c => println("data: %s (%s),command takes: %s" .format(d,d.getClass.getSimpleName,c.fromClass.getSimpleName)) if (d.getClass.isAssignableFrom(c.fromClass)) { println(" cmd(data) = " + c.execute.asInstanceOf[Any => Any](d)) } } } 输出是: data: StRiNG (String),command takes: String cmd(data) = string data: StRiNG (String),command takes: Date data: Sun Aug 05 14:46:17 CEST 2012 (Date),command takes: String data: Sun Aug 05 14:46:17 CEST 2012 (Date),command takes: Date cmd(data) = 1344170777681 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |