Scala 中是否可以将 isAssignableFrom 与类型参数一起使用?
我正在使用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
对此有一个解决方法。您可以使用
Manifest
类型类。通过使用它,Scala 编译器将确保类信息在运行时可用。Manifest
具有erasure
属性 - 它是泛型类型的类对象。您可以将它用于方法的类型参数,如下所示:
或简化:
您也可以将它用于类或抽象类:
不幸的是,您不能将它用于特征。
编辑:作为解决方法,您可以定义如下特征:
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
haserasure
property - it's the class object for generic type.You can use it for method's type parameters like this:
or simlified:
You can also use it for classes or abstract classes:
Unfortunately you can't use it for traits.
Edit: As workaround, you can define trait like this: