我无法为具有类型成员的类型解析scala.reflect.Manifest
。
例如,
import scala.reflect.Manifest
trait Foo {
type T
}
trait Bar[T]
object Main extends App {
val barM: Manifest[Bar[Int]] =
implicitly[Manifest[Bar[Int]]]
val fooM: Manifest[Foo{type T = Int}] =
implicitly[Manifest[Foo{type T = Int}]]
}
以上代码无法编译,产生以下错误。
Foo.scala:15: error: type mismatch;
found : scala.reflect.Manifest[Foo]
required: scala.reflect.Manifest[Foo{type T = Int}]
Note: Foo >: Foo{type T = Int}, but trait Manifest is invariant in type T.
You may wish to investigate a wildcard type such as `_ >: Foo{type T = Int}`. (SLS 3.2.10)
implicitly[Manifest[Foo{type T = Int}]]
^
one error found
但是barM
声明工作正常。
我知道类型成员不是类型参数,但我绝对不会对所有细微之处都有所了解。
如何为具有具体类型成员的类型解析Manifest
?
答案 0 :(得分:1)
Manifest
不支持结构类型。 SI-4252(Manifest
结构类型)标记为"无法修复",建议您改为使用TypeTag
。 Manifest
也很快就会被弃用。
scala> import scala.reflect.runtime.universe.TypeTag
import scala.reflect.runtime.universe.TypeTag
scala> implicitly[TypeTag[Foo { type T = Int} ]]
res18: reflect.runtime.universe.TypeTag[Foo{type T = Int}] = TypeTag[Foo{type T = Int}]
您也可以使用类型别名解决此问题,但在没有用例的情况下很难判断。
scala> type FooAux[T] = Foo { type T }
defined type alias FooAux
// Compiles, but is it useful?
scala> implicitly[Manifest[FooAux[Int]]]
res19: scala.reflect.Manifest[FooAux[Int]] = Foo