我有一个要映射的存在类型对象的列表。像这样的东西:
sealed abstract class IntBox(val v: Int)
case object IB1 extends IntBox(1)
case object IB2 extends IntBox(2)
case class Adder[A <: IntBox](ib: A, v: Int) {
def add(i: A) = v + i.v
}
val adders: List[Adder[_ <: IntBox]] = List(Adder(IB1, 0), Adder(IB2, 0))
adders.map(adder => adder.add(adder.ib))
但是,我收到了类似的错误
found: adder.ib.type
required: _$1
我觉得这就像因为map
以某种方式统一不同的IntBox
陷入一种无法获得的匿名类型......
我可以在不铸造的情况下得到我想要的东西吗(即adder.asInstanceOf[Adder[adder.ib.type]]...
?
该类型并非不可获取,您可以使用类型模式匹配来获取它:
adders.map{ case a: Adder[t] => a.add(a.ib) }
这里,存在类型参数绑定到类型变量t
,并且编译器可以正确推断出附加属性t
它无法推断整个列表。
请参阅部分规范8.3.1 https://scala-lang.org/files/archive/spec/2.12/08-pattern-matching.html#type-patterns更多细节。
完整代码与trait
取而代之class
使其编译
sealed abstract class IntBox(val v: Int)
case object IB1 extends IntBox(1)
case object IB2 extends IntBox(2)
case class Adder[A <: IntBox](ib: A, v: Int) {
def add(i: A) = v + i.v
}
val adders: List[Adder[_ <: IntBox]] = List(Adder(IB1, 0), Adder(IB2, 0))
adders.map{ case a: Adder[t] => a.add(a.ib) }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)