Scala 中的通配符只是存在类型的一种特定简单情况,而您想要的是更复杂的一种,因为您想T
在两个地方使用相同的。类似的东西Seq[(Class[T], AttributeKeyAndValue => T) forSome { type T }]
。但请注意您需要放置forSome
的位置:如果您愿意,没有等效的位置Map
!例如Map[Class[T], AttributeKeyAndValue => T] forSome { type T }
,这意味着整个地图都有一个T
。
我的建议是创建一个呈现更类型安全接口的类型,即使您需要在里面进行强制转换:
class Mappings private (contents: Map[Class[_], Iterable[AttributeKeyAndValue] => AnyRef]) {
def get[T](clazz: Class[T]) = contents.get(clazz).asInstanceOf[Option[Iterable[AttributeKeyAndValue] => T]]
def +[T](clazz: Class[T], value: Iterable[AttributeKeyAndValue] => T) = new Mappings(contents + (clazz, value))
// any other methods you want
}
object Mappings {
val empty = new Mappings(Map.empty)
}
// elsewhere
Mappings.empty + (classOf[String], attrs => "a") // type-checks
Mappings.empty + (classOf[String], attrs => 1) // doesn't type-check
您实际上可以改进 API 以避免手动传递类,因此您只需编写get[String]
并+(attrs => 1)
自动推断它需要 classOf[Int]
,但我决定在这里展示这个简单的想法。