繁体   English   中英

在Scala中可以将isAssignableFrom与类型参数一起使用吗?

[英]Is it possible in Scala to use isAssignableFrom with type parameters?

我正在使用Jersey在Scala中实现JAX-RS服务。 我将对Json提供程序具有通用特征,并且我需要知道请求的Class是否受我的提供程序支持。 在Java中,由于类型擦除,在运行时无法知道类型参数的类。 但是有可能在斯卡拉做吗?

此代码不起作用:

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中,最好的方法是在Scala中也有一个受保护的抽象方法来返回A类。

有解决方法。 您可以使用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)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM