Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
混合类型成员和类型参数时的Scala类型推断_Scala_Type Inference - Fatal编程技术网

混合类型成员和类型参数时的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%确定我在写什么;)是的,我不太关心
地图
(它的类型不能表达我想要什么,这就是为什么我隐藏它),但我希望
放置
的行为正确。