Scala 类型成员不编译
Scala type members do not compile
我写了下面这个简单的例子,希望它能编译好:
abstract class TestObject extends App{
type Type
def method[F[_]](ft: F[Type], t: Test[F]{
type Type = TestObject#Type
}) = t.doSomeAction(ft) //ERROR
}
trait Test[F[_]]{
type Type
def doSomeAction(t: F[Type]) = println(t)
}
但是编译器打印出以下错误信息:
Error:(8, 23) type mismatch;
found : ft.type (with underlying type F[TestObject.this.Type])
required: F[t.Type]
(which expands to) F[TestObject#Type]
Note: TestObject.this.Type <: t.Type, but type F is invariant in type _.
You may wish to define _ as +_ instead. (SLS 4.5)
}) = t.doSomeAction(ft)
从Test#Type = TestObject#Type
开始我就不太明白了。
所以问题是 TestObject#Type
捕获了一个不是你想要的存在类型。您要确保 Type
of specific 实例对齐。你可以这样做:
https://scalafiddle.io/sf/wpI8iGg/0
或更常见的辅助模式
我写了下面这个简单的例子,希望它能编译好:
abstract class TestObject extends App{
type Type
def method[F[_]](ft: F[Type], t: Test[F]{
type Type = TestObject#Type
}) = t.doSomeAction(ft) //ERROR
}
trait Test[F[_]]{
type Type
def doSomeAction(t: F[Type]) = println(t)
}
但是编译器打印出以下错误信息:
Error:(8, 23) type mismatch;
found : ft.type (with underlying type F[TestObject.this.Type])
required: F[t.Type]
(which expands to) F[TestObject#Type]
Note: TestObject.this.Type <: t.Type, but type F is invariant in type _.
You may wish to define _ as +_ instead. (SLS 4.5)
}) = t.doSomeAction(ft)
从Test#Type = TestObject#Type
开始我就不太明白了。
所以问题是 TestObject#Type
捕获了一个不是你想要的存在类型。您要确保 Type
of specific 实例对齐。你可以这样做:
https://scalafiddle.io/sf/wpI8iGg/0
或更常见的辅助模式