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

发布于 2024-10-16 06:15:58 字数 568 浏览 2 评论 0原文

我正在使用 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中也是如此吗?

I am implementing a JAX-RS service in Scala using Jersey. I would to have a generic trait for Json provider, and I need to know if the requested Class is supported by my provider. In java is not possible to know the class of a type parameter at runtime because the type erasure. But it is possible to do in scala?

This code does not work:

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
  }
}

Any suggestion? In Java the best method is to have a protected abstract method returning the class of A, in Scala too?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

猫腻 2024-10-23 06:15:58

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

There is workaround for this. You can use Manifest type class. By using it, Scala compiler will make sure, that class information would be available at runtime. Manifest has erasure property - it's the class object for generic type.

You can use it for method's type parameters like this:

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

or simlified:

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

You can also use it for classes or abstract classes:

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

Unfortunately you can't use it for traits.

Edit: As workaround, you can define trait like this:

trait Printer[T] {
  def printName(implicit ev: Manifest[T]) =
    println(ev.erasure.getSimpleName)
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文