Scala Foo[T]至Bar[T]的地图
这能做到吗Scala Foo[T]至Bar[T]的地图,scala,existential-type,type-level-computation,Scala,Existential Type,Type Level Computation,这能做到吗 case class Foo[T](value: T) case class Bar[T](value: T) val map = mutable.Map.empty[Foo[_], Bar[_]] map(Foo(1)) = Bar(1) // correct map(Foo(1)) = Bar(1.1) // should cause a compiler error 它应该允许任何类型的T,只要Foo#T和Bar#T是相同的。您可以尝试类似的方法,强制Foo和Bar的T类
case class Foo[T](value: T)
case class Bar[T](value: T)
val map = mutable.Map.empty[Foo[_], Bar[_]]
map(Foo(1)) = Bar(1) // correct
map(Foo(1)) = Bar(1.1) // should cause a compiler error
它应该允许任何类型的
T
,只要Foo#T
和Bar#T
是相同的。您可以尝试类似的方法,强制Foo
和Bar
的T
类型参数相同:
object Maps extends App {
import scala.collection.mutable
class C[T] {
case class Foo(value: T)
case class Bar(value: T)
}
val c = new C[Int]
import c._ // now Foo and Bar refer to c's types c.Foo and c.Bar
val map = mutable.Map.empty[Foo, Bar]
map(Foo(1)) = Bar(1) // correct
map(Foo(1)) = Bar(1.1) // should cause a compiler error, and it does
}
单独使用
Map
不允许强制执行该约束,因为Map
采用两个完全独立的类型参数。您可以定义一个包装类(围绕一个映射
),它将接受一个类型参数(对于底层映射
)的键和值)。我只是希望有一个更好的方法来实现这一点,因为我将创建一个纯粹用于类型约束的子类。谢谢你的回复!问题是我使用的框架提供了Foo[\u]
,它已经依赖于另一个上下文的路径。将其包装到另一个类中会使事情变得非常复杂。