- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个函数 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/
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicate: how to detect if variable is a string x = 'myname'; x.inta
假设,我们有: class B class A extends B trait T 那么它成立: val a: A with T = new A with T a.isInstanceOf[B] /
我对 isInstanceOf 在 Scala 中的工作方式感到困惑。如果我这样做: val x: Int = 5 x.isInstanceOf[Int] 鉴于 Scala 确实进行类型删除,JVM
我想为 isInstanceOf[T] 和 asInstanceOf[T] 对构建一个包装器,它将输出 Option[T]使用方便的 map 和 getOrElse 方法。 于是我尝试了一下,结果让我
在我的团队中,我经常看到队友在写作 list.filter(_.isInstanceOf[T]).map(_.asInstanceOf[T]) 但这对我来说似乎有点多余。 如果我们知道过滤列表中的所有
假设我有以下类层次结构: trait A; class A1 extends A; class A2 extends A 现在我需要过滤 A1 List[A] 中的实例.我使用模式匹配或 isInst
我想知道,为什么 AnyVal 不能在 isInstanceOf 检查中使用?这种行为背后的原因是什么? scala> val c = 't' c: Char = t scala> c.isInsta
我在 scala 中编写一个序列化程序,将对象(或模型)保存到数据库(用于应用程序引擎),我需要将某些字段视为特殊情况。例如,如果该字段的类型为 Array[Byte],我将其保存为一个 blob。我
我有一个函数 unlist 将任何类型的列表作为第一个参数: def unlist(xs: 列表[任何], ys: 列表[任何]): 列表[任何] = ... 我在外部列表的第一个元素上调用这个函数,
这是 REPL (scala 2.11) 中人为设计的实验: scala> class Foo[T] { | def as(x: Any) = x.asInstanceOf[T]
我有两个类:Foo 和 FooBar。 FooBar 派生自 Foo。我有一个工厂类,它根据给定的参数决定实例化和返回哪个对象。 所以我想进行单元测试来验证我的工厂类是否正常工作并返回正确的实例。 这
这只是我正在尝试实现的一种服务定位器类型的模式,我想在其中捕获将实现注册到它不属于的接口(interface)的尝试,如: public void Add(Type interfaceType, ob
为什么 isInstanceOf[T] 方法没有按预期工作? 在下面,我定义了一个 hello 类和伴随对象。在hello对象中,我在代码行“hel.typetest[Int]”中测试了this.is
我正在尝试为我的音乐播放器应用程序中的每首歌曲获取专辑封面。但是除了黑屏,没有专辑封面外,我什么也没得到。除了我从未听说过的日志猫错误之外,代码中似乎没有任何错误。 这是包含按钮单击监听器的 Java
假设我有一个 List[T],其中 E 扩展了 T。我想获取列表中的所有 E。我必须做类似的事情: val l = list filter {_.isInstanceof[E]} map {_
当使用 .isInstanceOf[GenericType[SomeOtherType]] 时,其中 GenericType 和 SomeOtherType 是任意类型(合适的类型),Scala由于类
我从原始目录读取 mp3 文件,它工作正常,但是每次启动媒体播放器时都会显示一些错误(如下所示)。 我的代码是... player1 = MediaPlayer.create(view.getCont
我正在尝试使用视频 View 在我的应用中播放视频歌曲。但是除了黑屏,我什么也没有得到,并且显示错误“无法播放视频”。除了我从未听说过的 log cat 错误之外,代码中似乎没有任何错误。 Video
我是一名优秀的程序员,十分优秀!