2011-01-10 2 views
1

У меня есть интерфейс в Java, который выглядит примерно так:Возвращает коллекцию Java типа и подклассов от Scala

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 

Любая идея хо w обойти эту проблему?

UPDATE:

Я пробовал следующий, но еще не повезло:

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

Как компилятор говорит, автоматически Inferred тип 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 
    } 
} 

EDIT: попробуйте это тогда:

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

Хммм, компилятор не нравится: ошибка: несоответствие типов; найдено: java.util.Set [java.lang.Class [_ $ 1 (в методе getTypeClasses)]] где type _ $ 1 (в методе getTypeClasses) <: org.infinispan.server.core.CacheValue требуется: java.util .Set [java.lang.Class [_ <: org.infinispan.server.core.CacheValue]] set –

+0

Это работает! Спасибо :) –