这是@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)
小测试:
scala> tupleToListRescueTypeInfo((2, 3))
res0: List[Int] = List(2, 3)
scala> tupleToListRescueTypeInfo((Some[Int](3), None))
res1: List[Option[Int]] = List(Some(3), None)
scala> tupleToListRescueTypeInfo((List(1,2), Set(1,2)))
res2: List[scala.collection.immutable.Iterable[Int] with Int => AnyVal] =
List(List(1, 2), Set(1, 2))
它显然不能保存所有类型信息,但它至少尝试尽可能多地挽救。