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]
,它已经依赖于另一个上下文的路径。将其包装到另一个类中会使事情变得非常复杂。