如何强制转换Scala集合类型?如Seq[Any]到Seq[(String,String)],没有警告

如何强制转换Scala集合类型?如Seq[Any]到Seq[(String,String)],没有警告,scala,scala-collections,Scala,Scala Collections,我想将scala集合类型转换为Seq[Any]到Seq[(String,String)],而不产生警告 示例代码: val seqs: Seq[Any] = Seq("1" -> "a", "2" -> "b") def func(seqs: Seq[(String, String)]): String = { } func(seqs.asInstanceOf[Seq[(String, String)]]) // this will be warning 2018年10月18日

我想将scala集合类型转换为
Seq[Any]
Seq[(String,String)]
,而不产生警告

示例代码:

val seqs: Seq[Any] = Seq("1" -> "a", "2" -> "b")

def func(seqs: Seq[(String, String)]): String = {
}

func(seqs.asInstanceOf[Seq[(String, String)]]) // this will be warning
2018年10月18日编辑:

为了更好地理解我的问题,以下是我的真实案例: 我有一个函数来处理带有参数的东西,实际上,我希望这个参数的类型是
Seq[Int]
Seq[(String,String)]

当我构建项目时,它会在[Seq[(String,String)]]的
specifiedSegs.asInstanceOf上打印警告。toSet
警告:类型模式(String,String)中的非变量类型参数字符串未选中,因为它已通过擦除消除

不建议使用
作为安装。可以使用函数实现更平滑的类型转换:

def seqOfAnyToSeqString(param : Seq[Any]) : Seq[(String, String)]
 = param.collect {
  case (x, y) => (x.toString, y.toString)
}
要测试此功能,请执行以下操作:

val a  = Seq(1,2,3, 4 -> "b")
seqOfAnyToSeqString(a)
产出:

a: Seq[Any] = List(1, 2, 3, (4,b))
res0: Seq[(String, String)] = List((4,b))
因此,它将默默地忽略序列中未定义为元组但将所有元组转换为字符串元组的元素。一、 当然,假设输入相当简单,一个简单的
.toString
就足够了

编辑:

或者,正如注释中所建议的,如果您完全确定序列是
Seq[(String,String)]
的一个实例,那么您可以将上述函数编写为:


但请注意,如果元素不符合
(字符串,字符串)

的要求,则会删除这些元素。如果要忽略所有非
(字符串,字符串)
元素,请参阅。或者,如果遇到非
(String,String)
元素时要抛出特定错误,可以使用以下方法:

def convertSeq(seq: Seq[Any]): Seq[(String, String)] = seq map {
  case (x: String, y: String) => (x, y)
  case x => throw new IllegalArgumentException(s"$x is not type (String, String)")
}
例如:

scala>def convertSeq(seq:seq[Any]):seq[(String,String)]=seq map{
|大小写(x:String,y:String)=>(x,y)
|案例x=>抛出新的IllegalArgumentException(s“$x不是类型(字符串,字符串)”)
| }
convertSeq:(seq:seq[Any])seq[(字符串,字符串)]
scala>convertSeq(序列((“abc”、“def”)、(“ghi”、“jkl”))
res0:Seq[(字符串,字符串)]=列表((abc,def),(ghi,jkl))
scala>convertSeq(Seq(1,2,3))
java.lang.IllegalArgumentException:1不是类型(字符串,字符串)
在$anonfun$convertSeq$1.应用(:13)
在$anonfun$convertSeq$1.应用(:11)
位于scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245)
位于scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245)
位于scala.collection.immutable.List.foreach(List.scala:381)
位于scala.collection.TraversableLike$class.map(TraversableLike.scala:245)
位于scala.collection.immutable.List.map(List.scala:285)
at.convertSeq(:11)
... 33删去

您能提供您试用过的代码吗?您需要更详细的说明,并在您遇到问题的地方提供代码。没有特别提到您想要什么?仅仅显示示例代码而不询问所面临的问题是不够的。请具体说明您的要求或您想要的澄清。val seqs:Seq[Any]=Seq(“1”->“a”,“2”->“b”)这是Seq(String,String)为什么要转换它?很抱歉问题描述模糊,为了更好地理解,我更新了我的案例。或者
案例(x:String,y:String)=>(x,y)
@dyrkin,它给出了
列表()
用于输入,例如:
Seq(0,1->1,2.3->“c”,true->false,4->“b”)
,而给定的答案会处理这些情况。OP并没有真正指定他们想要什么,你的建议也适用于问题中的情况。我认为dyrkin所评论的,
case(x:String,y:String)=>(x,y)
更好,因为如果元组已经符合字符串元组,它不会再次尝试转换为toString。转换为toString是多余的。@Raghhuramm:更新了答案以涵盖该情况。
def seqOfAnyToSeqString(param : Seq[Any]) : Seq[(String, String)]
     = param.collect {
      case (x : String, y : String) => (x, y)
    }
def convertSeq(seq: Seq[Any]): Seq[(String, String)] = seq map {
  case (x: String, y: String) => (x, y)
  case x => throw new IllegalArgumentException(s"$x is not type (String, String)")
}
scala> def convertSeq(seq: Seq[Any]): Seq[(String, String)] = seq map {
     |   case (x: String, y: String) => (x, y)
     |   case x => throw new IllegalArgumentException(s"$x is not type (String, String)")
     | }
convertSeq: (seq: Seq[Any])Seq[(String, String)]

scala> convertSeq(Seq(("abc", "def"), ("ghi", "jkl")))
res0: Seq[(String, String)] = List((abc,def), (ghi,jkl))

scala> convertSeq(Seq(1, 2, 3))
java.lang.IllegalArgumentException: 1 is not type (String, String)
  at $anonfun$convertSeq$1.apply(<console>:13)
  at $anonfun$convertSeq$1.apply(<console>:11)
  at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245)
  at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245)
  at scala.collection.immutable.List.foreach(List.scala:381)
  at scala.collection.TraversableLike$class.map(TraversableLike.scala:245)
  at scala.collection.immutable.List.map(List.scala:285)
  at .convertSeq(<console>:11)
  ... 33 elided