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

scala – 如何在多态unapply中使用提取器?

发布时间:2020-12-16 18:15:59 所属栏目:安全 来源:网络整理
导读:我真的没有得到这个小东西.我有一个抽象类Box 有几个不同类型的子类.例如 abstract class Boxclass StringBox(val sValue : String) extends Box Box的伴侣对象中的apply方法很简单: object Box{ def apply(s: String) = new StringBox(s) def apply(b: Boo
我真的没有得到这个小东西.我有一个抽象类Box
有几个不同类型的子类.例如

abstract class Box
class StringBox(val sValue : String) extends Box

Box的伴侣对象中的apply方法很简单:

object Box{
    def apply(s: String)  = new StringBox(s)
    def apply(b: Boolean) = new BooleanBox(b)
    def apply(d: Double)  = new DoubleBox(d)
}

所以我可以写

val sb = Box("StringBox)

好的,写不应用会带来一些麻烦.我的第一个想法是在类型上使用模式匹配,如下所示:

def unapply(b: Box) = b match {
  case sb: StringBox => Some(sb.sValue)
  case bb: BooleanBox => Some(bb.bValue)
  case db: DoubleBox => Some(db.dValue)
  case _ => None

}

由于类型擦除,这根本不起作用.

第二次尝试是具有类型T的通用Box [T]和重新定义的抽象类型成员
在每个子类中.例如:

abstract class Box[T] {def value : T}
 class StringBox(val sValue : String)  extends Box[String] { 
   override def value : String = sValue
 }

因此,我可以写下我的unapply:

def unapply[T](b: Box[T]) = b match {
  case sb: Box[String]  => Some(sb.value)
  case bb: Box[Boolean] => Some(bb.value)
  case db: Box[Double]  => Some(db.value)
  case _ => None

不幸的是,这也不起作用.所以我想是显式类型引用
在Box [String]中也被删除了所以我需要使用类型清单.
也许是这样的:

def unapply[T](b: Box[_])(implicit target: Manifest[T]): Option[T] = {

   if(b.value ==  target) Some(b.value.asInstanceOf[T])
   else None 
}

此代码编译(2.10)但仍未进行所需的隐式转换.
为什么?

简单的问题是,有没有办法在不使用反射的情况下进行值提取
还是一个清单?

真正难以理解的是,如果有一种简单的(r)组合方式的问题
多态性和模式匹配?如果没有,Scala还有其他方法吗?
完成类似的效果?

有什么想法或建议吗?

非常感谢你.

解决方法

Prolly你可以尝试这个..

(编辑:李大同)

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

    推荐文章
      热点阅读