使用泛型类作为键/值类型的 Scala Map

use*_*572 4 generics scala shapeless

我正在尝试在 Scala 中实现以下目标,这似乎超出了我的“通用”技能:

我有 2 个通用类:

class A[T]
class B[T]
Run Code Online (Sandbox Code Playgroud)

我想将一些 As 映射到一些 B:

val m = Map[A, B]
Run Code Online (Sandbox Code Playgroud)

现在不能编译,因为 A 和 B 是通用的,所以

val m = Map[A[_], B[_]]
Run Code Online (Sandbox Code Playgroud)

我希望能够存储任意类型 T 的 A/B 对。但是我只想添加键和值的泛型类型相同的对。所以我可以做

m updated(new A[String], new B[String])
Run Code Online (Sandbox Code Playgroud)

但不是

m updated(new A[String], new B[Int])
Run Code Online (Sandbox Code Playgroud)

我希望编译器意识到这一点,所以我可以做

val a = new A[String]
val b = new A[String]
val m = Map(a -> b)
val b: B[String] = m(a) //
Run Code Online (Sandbox Code Playgroud)

我在想像无形的图书馆会有所帮助吗?

jwv*_*wvh 6

我认为这会强制执行您所追求的限制。

class A[T]
class B[T]
val as = new A[String]
val bs = new B[String]
val ai = new A[Int]
val bi = new B[Int]
val ms: Map[A[X], B[X]] forSome {type X}= Map(as -> bs)  // OK
val mi: Map[A[X], B[X]] forSome {type X}= Map(ai -> bi)  // OK
Run Code Online (Sandbox Code Playgroud)

没有其他的组合asbsai,和bi将编译。