gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:16:23 25 4
gpt4 key购买 nike

我正在使用 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 中,最好的方法是让一个 protected 抽象方法返回 A 的类,在 Scala 中也是如此吗?

最佳答案

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

关于java - 在 Scala 中是否可以将 isAssignableFrom 与类型参数一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4939833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com