为具有类型成员的类型解析`Manifest`

时间:2015-10-05 16:06:14

标签: scala type-members

我无法为具有类型成员的类型解析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

1 个答案:

答案 0 :(得分:1)

Manifest不支持结构类型。 SI-4252Manifest结构类型)标记为"无法修复",建议您改为使用TypeTagManifest也很快就会被弃用。

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