gpt4 book ai didi

list - 即使在使用 isInstanceOf 检查类型后,Scala 类型不匹配错误

转载 作者:行者123 更新时间:2023-12-01 15:20:13 25 4
gpt4 key购买 nike

我有一个函数 unlist 将任何类型的列表作为第一个参数:

def unlist(xs: 列表[任何], ys: 列表[任何]): 列表[任何] = ...

我在外部列表的第一个元素上调用这个函数,它可能是也可能不是列表的列表。因此,我首先需要检查这个 head 元素本身是否是一个列表,在这种情况下我可以调用我的 unlist 函数。我使用 InsintanceOf 方法来实现,如下所示:

...
if (xs.head.isInstanceOf[List[Any]]) unlist(xs.head, ys)

但是,由于 xs.head 上的类型不匹配,这不会编译:

Error: type mismatch;
found : Any
required: List[Any]

我做错了什么?


P.S.:由于你们中的许多人建议避免类型 Any ,我必须指定这是编码练习的一部分,目的是使函数像可能的

最佳答案

为了说明 Mateusz 的评论

isInstanceOf is not being remembered

这意味着我们必须像这样跟进 asInstanceOf

if (list.head.isInstanceOf[List[_]]) unlist(list.head.asInstanceOf[List[_]])

Tim 演示的模式匹配隐式执行 isInstanceOf/asInstanceOf 组合。还要考虑相关answer .

如果您无法重构Any,这是最弱类型,也许可以尝试尽早恢复尽可能多的类型信息,也许像这样

val lists: List[List[_]] = list.collect { case xs: List[_] => xs }
val ints: List[Int] = list.collect { case i: Int => i }
val strings: List[String] = list.collect { case s: String => s }

请注意,由于类型删除,我们无法轻易地比List[List[_]]做得更好,例如,以下断言通过

val list: List[Any] = List(List("woo", "hoo"), 42, "kerfuffle")
assert(list.head.isInstanceOf[List[Double]])

在最后一种情况下,编译器警告会告诉您 类型 List[Double](List[Double] 的基础)中的类型参数 Double 未被选中,因为它被删除消除了。忽略此类警告通常不是一个好主意。

关于list - 即使在使用 isInstanceOf 检查类型后,Scala 类型不匹配错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60561688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com