我试图理解为什么 Scala 编译器不能推断出对路径相关类型的以下限制:
trait MyTrait
class MyTraitImpl extends MyTrait
trait MyTrait2[A <: MyTrait] {
type MyTraitType = A
}
class MyTrait2Impl[A <: MyTrait] extends MyTrait2[A]
val obj: MyTrait2[_] = new MyTrait2Impl[MyTraitImpl]
def myMethod[A <: MyTrait](t2: MyTrait2[A]) = println("Hi!")
myMethod[obj.MyTraitType](obj)
// <console>:14: error: type arguments [obj.MyTraitType] do not conform to method myMethod's type parameter bounds [A <: MyTrait]
// myMethod[obj.MyTraitType](obj)
对我来说,直觉上,MyTraitType
不能是 a 的子类MyTrait
,因为边界就在A
in上MyTrait2
。如果有,你能给我一个例子或指出这个代码片段的错误吗?
如果这是 Scala 编译器的限制,谁能告诉我一种使用类型系统实现这一目标的方法?注意:
- 我没有
MyTrait
对象,也没有myMethod
收到; - 我不需要
myMethod
知道具体的类型A
;它只需要知道A
它是 的子类型MyTrait
并且t2
参数化了A
; - 中的下划线
obj
是有意的;在我打电话myMethod
的地方,我不知道具体类型A
(否则不会有问题); - 我更喜欢不需要修改的解决方案
myMethod
。