Scala:将异构元组转换为列表

Scala:将异构元组转换为列表,scala,types,type-inference,Scala,Types,Type Inference,在Scala命令行中,写入以下内容没有问题: List((1,2),(1,'a')) 但是我似乎无法编写一个函数来将Tuple2转换为List,因为Tuple2接受两个类型参数,而List只接受一个。任何尝试,例如: def tuple2ToList[T1, T2](pair: (T1, T2)): List[Any] = List(pair._1, pair._2) 似乎注定会丢失类型信息。在这个过程中,我们可以做些什么来保存一些类型信息吗?这是@BenReich在评论中提出的解决方案 只

在Scala命令行中,写入以下内容没有问题:

List((1,2),(1,'a'))
但是我似乎无法编写一个函数来将
Tuple2
转换为
List
,因为
Tuple2
接受两个类型参数,而
List
只接受一个。任何尝试,例如:

def tuple2ToList[T1, T2](pair: (T1, T2)): List[Any] = List(pair._1, pair._2)
似乎注定会丢失类型信息。在这个过程中,我们可以做些什么来保存一些类型信息吗?

这是@BenReich在评论中提出的解决方案

只需使用一个类型参数而不是两个,编译器将 自动选择两种类型中的最小上限 元组元素:

def tupleToList[T](p: (T, T)): List[T] = List(p._1, p._2)
示例:

scala> tupleToList((Some(42), None))
res4: List[Option[Int]] = List(Some(42), None)

scala> tupleToList((0.9999, 1))
res5: List[AnyVal] = List(0.9999, 1)

scala> tupleToList((Set(1), List(1)))
res6: List[scala.collection.immutable.Iterable[Int] with Int => AnyVal] = List(Set(1), List(1))

这是旧的次优解决方案,我将把它作为@BenReich评论的上下文放在这里

将返回类型定义为
T1
T2
的最小上限:

def tupleToListRescueTypeInfo[R, T1 <: R, T2 <: R](p: (T1, T2)): List[R] = 
  List(p._1, p._2)
显然,它无法保存所有类型信息,但它至少尝试尽可能多地进行抢救。

这是@BenReich在一篇评论中提出的解决方案

只需使用一个类型参数而不是两个,编译器将 自动选择两种类型中的最小上限 元组元素:

def tupleToList[T](p: (T, T)): List[T] = List(p._1, p._2)
示例:

scala> tupleToList((Some(42), None))
res4: List[Option[Int]] = List(Some(42), None)

scala> tupleToList((0.9999, 1))
res5: List[AnyVal] = List(0.9999, 1)

scala> tupleToList((Set(1), List(1)))
res6: List[scala.collection.immutable.Iterable[Int] with Int => AnyVal] = List(Set(1), List(1))

这是旧的次优解决方案,我将把它作为@BenReich评论的上下文放在这里

将返回类型定义为
T1
T2
的最小上限:

def tupleToListRescueTypeInfo[R, T1 <: R, T2 <: R](p: (T1, T2)): List[R] = 
  List(p._1, p._2)

显然,它不能保存所有类型信息,但它至少尝试尽可能地保存。

List((1,2)、(1,'a'))
也会丢失类型信息。
List((1,2)、(1,'a'))
也会丢失类型信息。为什么不干脆
定义元组列表[T](p:(T,T)):List[T]=List(p.\u 1,p.\u 2)
?编译器可以使用更简单的方法签名自动确定测试用例的最小上界。@BenReich!谢谢你指出这一点。你介意把你的评论转换成答案吗?然后我可以去掉这里的次优解。否则,如果你认为这件事太琐碎,我可以复制你的评论到我的答案,并宣布它是一个社区维基……为什么不简单地<代码> DEF tuptoist[t](p:(t,t)):列表[t]=列表(P.1,P.2)< /代码>?编译器可以使用更简单的方法签名自动确定测试用例的最小上界。@BenReich!谢谢你指出这一点。你介意把你的评论转换成答案吗?然后我可以去掉这里的次优解。否则,如果你认为这件事太琐碎,我可以复制你的评论粘贴到我的答案,并宣布它是一个社区维基…