【问题标题】:Is it possible in Scala to use isAssignableFrom with type parameters?在 Scala 中是否可以将 isAssignableFrom 与类型参数一起使用?
【发布时间】:2011-02-08 23:45:32
【问题描述】:

我正在使用 Jersey 在 Scala 中实现 JAX-RS 服务。我想为 Json 提供者提供一个通用特征,并且我需要知道我的提供者是否支持请求的类。由于类型擦除,在 java 中不可能在运行时知道类型参数的类。但是可以在scala中做吗?

此代码不起作用:

trait JsonProvider[A] extends MessageBodyReader[A] with MessageBodyWriter[A] {

  final def isReadable(t : Class[_],
             genericType: Type,
             annotations: Array[Annotation],
             mediaType: MediaType): Boolean = {
    t.isAssignableFrom(classOf[A]) && mediaType == MediaType.APPLICATION_JSON_TYPE
  }
}

有什么建议吗?在 Java 中,最好的方法是让受保护的抽象方法返回 A 的类,在 Scala 中也是如此?

【问题讨论】:

    标签: java scala traits type-parameter


    【解决方案1】:

    对此有解决方法。您可以使用Manifest 类型类。通过使用它,Scala 编译器将确保类信息在运行时可用。 Manifest 具有 erasure 属性 - 它是泛型类型的类对象。

    您可以将它用于方法的类型参数,如下所示:

    def printClass[T](implicit ev: Manifest[T]) =
      println(ev.erasure.getSimpleName)
    

    或简化:

    def printClass1[T: Manifest] =
      println(manifest[T].erasure.getSimpleName)
    

    您也可以将它用于类或抽象类:

    class Printer[T: Manifest] {
      def printName = println(manifest[T].erasure.getSimpleName)
    }
    

    很遗憾,您不能将其用于特征。

    编辑:作为解决方法,您可以像这样定义特征:

    trait Printer[T] {
      def printName(implicit ev: Manifest[T]) =
        println(ev.erasure.getSimpleName)
    }
    

    【讨论】:

    • 是的,我刚刚注意到,由于隐式构造函数参数,它不可能用于 Trait。
    • 如果需要,您还可以将清单的抽象 val 放入特征中,如 trait Printer[T]{val ev:Manifest[T];...} 并覆盖如 class Foo extends Printer[String] { override val ev=manifest[String]}
    猜你喜欢
    • 2020-06-13
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    相关资源
    最近更新 更多