【问题标题】:Return a Java collection of type and subclasses from Scala从 Scala 返回类型和子类的 Java 集合
【发布时间】:2011-06-06 11:00:08
【问题描述】:

我有一个 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

【问题讨论】:

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


    【解决方案1】:

    正如编译器所说,自动推断的类型是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
      }
    }
    

    【讨论】:

    • 嗯,编译器不喜欢这样:错误:类型不匹配;找到:java.util.Set[java.lang.Class[$1(in method getTypeClasses)]] 类型 _$1(in method getTypeClasses) <: org.infinispan.server.core.cachevalue required: java.util .set><: org.infinispan.server.core.cachevalue>
    猜你喜欢
    • 2011-05-17
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 2011-07-09
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    相关资源
    最近更新 更多