【发布时间】:2019-09-03 20:33:50
【问题描述】:
我有一个Map,它的键是一个类的子类型。我无法使用类型为该类实例的变量从地图中获取值。
trait Foo { }
class FooImpl extends Foo {}
class Sample
{
val m: Map[_ <: Foo, String] = Map()
val foo: Foo = new FooImpl
// This line fails to compile
m(foo)
val m2: Map[Foo, String] = Map()
// This line compiles fine (but will throw at runtime)
m2(foo)
}
我使用的是scala 2.12,通配符版本编译失败:
[info] Compiling 1 Scala source to /test/scala/target/scala-2.12/classes ...
[error] /test/scala/src/main/scala/Test.scala:10:7: type mismatch;
[error] found : Sample.this.foo.type (with underlying type Foo)
[error] required: _$1
[error] m(foo)
[error] ^
[error] one error found
是否可以在不执行m.filter({(k,v) => k.equals(foo)}) 之类的操作的情况下从第一个映射 (m) 中获取特定值?在 Java 中,我可以使用 m.get(foo),而 Scala 似乎不太可能迫使我比 Java 更冗长且不够清晰。
澄清。我知道对m2(foo) 的调用将在运行时抛出。在实际情况下,地图包含foo。我的问题是编译错误,而不是运行时错误。
【问题讨论】:
-
val m2: Map[Foo, String] = Map()m2.get(foo)有什么问题,返回Option?m2(foo)在运行时抛出异常,因为m2为空。在 Java 中Map<K, V>#get有不同的签名V get(Object key)。这将对应于Map[Any, String]。 -
使用
m2的问题是地图来自一个外部库,其类型与我在m上使用的类型相同。m.get(foo)编译失败,出现类似错误。
标签: scala