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)
我在想像无形的图书馆会有所帮助吗?
我认为这会强制执行您所追求的限制。
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)
没有其他的组合as,bs,ai,和bi将编译。