从Scala返回类型和子类的Java集合

时间:2011-01-10 10:31:11

标签: scala scala-2.8 scala-collections scala-java-interop

我有一个Java界面,看起来像这样:

public interface X<T> {
  Set<Class<? extends T>> getTypes();
}

我需要在Scala 2.8中实现这个接口,目前我正在做这样的事情:

class XImpl extends X<CacheValue> {
  override def getTypes = {
    val set = asJavaSet(Set(classOf[CacheValue]))
    set
  }
}

但这不编译,编译器说:

error: type mismatch;
found   : java.util.Set[java.lang.Class[CacheValue]]
required: java.util.Set[java.lang.Class[_ <: CacheValue]]
set

知道如何解决这个问题吗?

更新:

我尝试过以下但仍然没有运气:

  override def getTypeClasses = {
     val set = asJavaSet(Set(classOf[CacheValue].asSubclass(classOf[CacheValue])))
     set
  }

在后一种情况下,我得到:

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

1 个答案:

答案 0 :(得分:4)

正如编译器所说,自动推断的类型是java.util.Set[java.lang.Class[CacheValue]],但是如果你明确地注释了这个类型它应该有效:

class XImpl extends X[CacheValue] {
  override def getTypes = {
    val set = asJavaSet(Set(classOf[CacheValue]: java.lang.Class[_ <: CacheValue]))
    set
  }
}

编辑:然后尝试:

class XImpl extends X[CacheValue] {
  override def getTypes = {
    val set = asJavaSet(Set[java.lang.Class[_ <: CacheValue]](classOf[CacheValue]))
    set
  }
}