我正在使用Shapeless,以下是我用来计算两个HList之间差异的方法:
def diff[H <: HList](lst1: H, lst2:H):List[String] = (lst1, lst2) match {
case (HNil, HNil) => List()
case (h1::t1, h2::t2) if h1 != h2 => s"$h1 -> $h2" :: diff(t1, t2)
case (h1::t1, h2::t2) => diff(t1, t2)
case _ => throw new RuntimeException("something went very wrong")
}
由于该方法的两个参数都采用了H
,因此我预期不同类型的HList在此处无法编译通过。例如:
diff("a" :: HNil, 1 :: 2 :: HNil)
虽然不应该编译通过,但它确实编译通过了,并且会产生运行时错误:java.lang.RuntimeException: something went very wrong
。有没有什么方法可以对类型参数进行操作,使得这个方法只能接受两个具有相同类型的边?
lst1
或lst2
其中一个为空的情况,这很可能是导致错误的原因。 - Régis Jean-GillesHList
特质没有参数化,所以在你的方法调用中H
只会被解析为Hlist
(无论具体元素类型如何,它确实是任何Hlist
的超类型)。请看我的回答。 - Régis Jean-Gilles