1

私は次のような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
4

1 に答える 1

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
  }
}
于 2011-01-10T10:54:39.317 に答える