混合类型成员和类型参数时的Scala类型推断
我有以下定义:混合类型成员和类型参数时的Scala类型推断,scala,type-inference,Scala,Type Inference,我有以下定义: trait Xode[+R] { type S = Option[R] } case class AXode(a: Int) extends Xode[Int] case class BXode(b: String) extends Xode[String] object xtore { private var m: Map[Xode[_], Xode[_]#S] = Map() def put[A <: Xode[_]](k: A)(v: A#S) {
trait Xode[+R] {
type S = Option[R]
}
case class AXode(a: Int) extends Xode[Int]
case class BXode(b: String) extends Xode[String]
object xtore {
private var m: Map[Xode[_], Xode[_]#S] = Map()
def put[A <: Xode[_]](k: A)(v: A#S) {
m += k -> v
}
}
trait Xode[+R]{
类型S=选项[R]
}
case类AXode(a:Int)扩展了Xode[Int]
case类BXode(b:String)扩展了Xode[String]
对象xtore{
私有变量m:Map[Xode[\uz],Xode[\uz]#S]=Map()
def put[A v]
}
}
执行以下命令时,不会出现错误,尽管我希望AXode是Option[Int]
xtore.put(AXode(5))(Some("apples")) // <-- no error
xtore.put(AXode(5))(一些(“苹果”)//一些(可能解释有点错误)
X[\u]
意味着X[Any]
。特别是,您的映射没有将值类型与通配符参数上的键类型关联到Xode
类型构造函数。除了put
,scalac还可以将A
的类型扩展到Xode[Any]
如果需要。免责声明:我不能100%确定我在写什么
通过问题的代码
以下内容拒绝了xtore.put(AXode(5))(一些(“苹果”)
,并接受xtore.put(AXode(5))(一些(0))
。请注意,您还需要捕获Xode
的类型参数,而不是OP中的Xode[\u]
版本。我不完全理解它,可能有更简单的解决方案
def put[A,B[X] <: Xode[X]](k: B[A])(v: B[A]#S) {
m += k -> v
}
def put[A,B[X]v
}
X[\u]
表示X[Any]
。特别是,您的映射不会将值类型与通配符参数上的键类型关联到Xode
类型构造函数。此外,除了put
,scalac还可以将A
的类型扩展到Xode[Any]
如果需要。免责声明:我不是100%确定我在写什么;)是的,我不太关心地图
(它的类型不能表达我想要什么,这就是为什么我隐藏它),但我希望放置
的行为正确。