不同类型的List的通用不适用方法 [英] Generic unapply method for different types of List

查看:143
本文介绍了不同类型的List的通用不适用方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有办法用泛型概括这段代码?

  object ListInt {
def unapply(o:任何):选项[List [Int]] = o match {
case lst:List [_] if(lst.forall(_。isInstanceOf [Int]))=>
Some(lst.asInstanceOf [List [Int]])
case _ =>无


对象ListDouble {
def unapply(o:Any):Option [List [Double]] = o match {
case lst:List [ _] if(lst.forall(_。isInstanceOf [Double]))=>
Some(lst.asInstanceOf [List [Double]])
case _ =>无


对象ListString {
def unapply(o:Any):Option [List [String]] = o match {
case lst:List [ _] if(lst.forall(_。isInstanceOf [String]))=>
Some(lst.asInstanceOf [List [String]])
case _ =>无
}
}

val o:任何=列表(a,b,c)
o匹配{
case ListInt (lst)=> println(lst.sum)
case ListDouble(lst)=> println(lst.product)
case ListString(lst)=> println(lst.mkString((,,,)))
case _ => println(no match)
}


解决方案

 抽象类ListExtractor [A](隐式ct:reflect.ClassTag [A]){
def unapply(o:Any):Option [List [A]] = o match {
case lst:List [_] if(lst.forall(ct.unapply(_)。isDefined))=>
Some(lst.asInstanceOf [List [A]])
case _ =>无



对象ListInt extends ListExtractor [Int]
对象ListString extends ListExtractor [String]

val o:Any =列表(a,b,c)
o匹配{
case ListInt(lst)=> println(lst.sum)
case ListString(lst)=> println(lst.mkString((,,,)))
case _ => println(不匹配)
}


Is there a way to generalize this code with generics?

object ListInt {
  def unapply(o: Any): Option[List[Int]] = o match {
    case lst: List[_] if(lst.forall(_.isInstanceOf[Int])) => 
      Some(lst.asInstanceOf[List[Int]])
    case _ => None
  }
}
object ListDouble {
  def unapply(o: Any): Option[List[Double]] = o match {
    case lst: List[_] if(lst.forall(_.isInstanceOf[Double])) =>
      Some(lst.asInstanceOf[List[Double]])
    case _ => None
  }
}
object ListString {
  def unapply(o: Any): Option[List[String]] = o match {
    case lst: List[_] if(lst.forall(_.isInstanceOf[String])) =>
      Some(lst.asInstanceOf[List[String]])
    case _ => None
  }
}

val o: Any = List("a", "b", "c")
o match {
  case ListInt(lst) => println(lst.sum)
  case ListDouble(lst) => println(lst.product)
  case ListString(lst) => println(lst.mkString("(", ", ", ")"))
  case _ => println("no match")
}

解决方案

abstract class ListExtractor[A](implicit ct: reflect.ClassTag[A]) {
  def unapply(o: Any): Option[List[A]] = o match {
    case lst: List[_] if (lst.forall(ct.unapply(_).isDefined)) =>
      Some(lst.asInstanceOf[List[A]])
    case _ => None
  }
}

object ListInt    extends ListExtractor[Int   ]
object ListString extends ListExtractor[String]

val o: Any = List("a", "b", "c")
o match {
  case ListInt   (lst) => println(lst.sum)
  case ListString(lst) => println(lst.mkString("(", ", ", ")"))
  case _               => println("no match")
}

这篇关于不同类型的List的通用不适用方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆