Return a Java collection of type and subclasses from Scala
I have an interface in Java that looks something like this:
public interface X<T> {
Set<Class<? extends T>> getTypes();
}
I need to implement this interface in Scala 2.8 and currently I'm doing something like this:
class XImpl extends X<CacheValue> {
override def getTypes = {
val set = asJavaSet(Set(classOf[CacheValue]))
set
}
}
But this does not compile and the compiler says:
error: type mismatch;
found : java.util.Set[java.lang.Class[CacheValue]]
required: java.util.Set[java.lang.Class[_ <: CacheValue]]开发者_如何学Python
set
Any idea how to get around this issue?
UPDATE:
I've tried the following but still no luck:
override def getTypeClasses = {
val set = asJavaSet(Set(classOf[CacheValue].asSubclass(classOf[CacheValue])))
set
}
In this latter case I get:
error: type mismatch;
found : java.util.Set[java.lang.Class[?0]] where type ?0 <: org.infinispan.server.core.CacheValue
required: java.util.Set[java.lang.Class[_ <: org.infinispan.server.core.CacheValue]]
set
As the compiler says, the automatically inferred type is java.util.Set[java.lang.Class[CacheValue]]
, but it should work if you annotate the type explicitly:
class XImpl extends X[CacheValue] {
override def getTypes = {
val set = asJavaSet(Set(classOf[CacheValue]: java.lang.Class[_ <: CacheValue]))
set
}
}
EDIT: try this then:
class XImpl extends X[CacheValue] {
override def getTypes = {
val set = asJavaSet(Set[java.lang.Class[_ <: CacheValue]](classOf[CacheValue]))
set
}
}
精彩评论