gpt4 book ai didi

scala - java.util.Iterator到Scala列表?

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

我有以下代码:

private lazy val keys: List[String] = obj.getKeys().asScala.toList
obj.getKeys返回一个 java.util.Iterator<java.lang.String>
根据文档通过 asScala(已导入)调用 JavaConverers
java.util.Iterator <==> scala.collection.Iterator 
scala.collection.Iterator定义
def toList: List[A] 

因此,基于此,我认为这应该可行,但是这是编译错误:
[scalac]  <file>.scala:11: error: type mismatch;
[scalac] found : List[?0] where type ?0
[scalac] required: List[String]
[scalac] private lazy val keys : List[String] = obj.getKeys().asScala.toList
[scalac] one error found

我了解类型参数或java迭代器是Java字符串,并且我试图创建一个Scala字符串列表,但是(也许很幼稚)认为会有一个隐式转换。

最佳答案

如果obj.getKeys()是java.util.Iterator<String>,那将起作用。我想不是。

如果obj.getKeys()只是原始格式的java.util.Iterator,而不是java.util.Iterator<String>,甚至不是java.util.Iterator<?>,这都是scala不喜欢的东西,但是无论如何,如果无法保证List[String]包含String,则scala无法将表达式键入obj.getKeys()

如果您知道您的迭代器在Strings上,但是类型却不是这样,则可以强制转换:

obj.getKeys().asInstanceOf[java.util.Iterator[String]]

(然后继续 .asScala.toList)

请注意,就像在Java中一样,由于类型为Erase,将不检查强制类型转换(您将得到警告)。如果您想立即检查是否有字符串,您可能宁愿这样做
obj.getKeys().map(_.asInstanceOf[String])

在迭代构建列表时,它将检查每个元素的类型

关于scala - java.util.Iterator到Scala列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7589561/

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