【问题标题】:Equivalent of Java '?' in Scala [duplicate]等效于 Java '?'在 Scala [重复]
【发布时间】:2020-03-19 20:12:05
【问题描述】:

我有一个签名看起来像这样的 Java 方法:

public Map<String, ?> getData() {
    return data;
}

我正在尝试将此返回值作为 Scala 方法的参数:

import java.util.{Map => jMap}

def myMethod(m: jMap[String, Any]): Unit = {
  // do stuff
}

// myMethod(foo.getData())

这样,编译器会报错:

 found   : java.util.Map[String,?0] where type ?0
 required: java.util.Map[String,Any]

什么是?,它的 Scala 等价物是什么?

当我尝试时:

def myMethod(m: jMap[String, ?]): Unit = {
  // do stuff
}

错误:

not found: type ?

信息:

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T07:58:13Z)
Maven home: /usr/share/maven
Java version: 1.8.0_152, vendor: Oracle Corporation
Java home: /usr/java/jdk1.8.0_152/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.19.76-linuxkit", arch: "amd64", family: "unix"

【问题讨论】:

  • 我不完全确定,但我相信jMap[String, _] 应该可以工作。如果不是,那么更详细的存在形式应该jMap[String, A] forSome { type A }

标签: java scala


【解决方案1】:

虽然可能不是规范或最有效的解决方案,但我最终将converting the Java map 转换为 Scala 映射,再加上 _ 代替 Any。请注意,.asScala 默认会生成一个可变映射。

import scala.collection.mutable
import scala.jdk.CollectionConverters._

def myMethod(m: mutable.Map[String, _]): Unit = {
// ...

myMethod(obj.getData().asScala)

注意:自 2.13.1 起,collection.JavaConverters._ 已弃用,取而代之的是 scala.jdk.CollectionConverters._。 [source]

【讨论】:

  • IMO 它既规范又高效,因为它们只是转发到底层集合的包装器。在 Scala 2.13 中使用 import scala.jdk.CollectionConverters._.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
  • 2012-10-06
  • 1970-01-01
  • 2011-03-07
相关资源
最近更新 更多