2010-01-29 7 views
6

Je le code suivant pour la construction d'un cache à l'aide des collections google:Implémentation d'une interface java dans Scala

val cache = new MapMaker().softValues().expiration(30, 
TimeUnit.DAYS).makeComputingMap(
    new com.google.common.base.Function[String,Int] { 
     def apply(key:String):Int ={ 
     1 
    } 
    }) 

Et je reçois le message d'erreur suivant:

error: type mismatch; 
found : java.lang.Object with 
com.google.common.base.Function[java.lang.String,Int]{ ... } 
required: com.google.common.base.Function[?, ?] 
    new com.google.common.base.Function[String,Int] { 
^

Je me demande pourquoi la les types ne correspondent pas?

Le code actuel est:

import com.google.common.collect.MapMaker 
trait DataCache[V] { 
    private val cache = new MapMaker().softValues().makeComputingMap(
    new com.google.common.base.Function[String,V] { 
     def apply(key:String):V = null.asInstanceOf[V] 
    }) 
    def get(key:String):V = cache.get(key) 
} 

Meilleures salutations, Ali

PS - J'utilise google-collections v1

Répondre

7

Vous devez fournir des paramètres de type à l'appel de méthode final. Vous passez par l'interface de type brut et Scala ne peut pas reconstruire les informations de type.

val cache = new MapMaker().softValues().expiration(30, 
TimeUnit.DAYS).makeComputingMap[String, Int](
    new com.google.common.base.Function[String,Int] { 
     def apply(key:String):Int ={ 
     1 
    } 
    }) 
1

Est-ce que les travaux suivants?

new com.google.common.base.Function[_,_] { 

Si cela ne fonctionne pas, vous pouvez conserver la déclaration telle qu'elle est en ce moment, puis ajouter un : com.google.common.base.Function[_, _] après, comme ceci:

val cache = new MapMaker().softValues().expiration(30, 
TimeUnit.DAYS).makeComputingMap(
    new com.google.common.base.Function[String,Int] { 
     def apply(key:String):Int ={ 
     1 
    } 
    }: com.google.common.base.Function[_, _]) 

J'ai entendu dire que certains Les trucs de Google utilisent des types bruts, qui sont plutôt difficiles à bien intégrer avec Scala. Et, en fait, devrait être banni en enfer, d'où ils viennent, mais c'est juste imho. En outre, si vous pouviez compiler avec -explaintypes, nous pourrions avoir une meilleure idée de ce qui échoue.

+0

ne fonctionne pas, maintenant je reçois cette erreur: type de classe requis, mais com.google.common.base.Function [_, _] trouvé nouvelle com.google.common.base.Function [ _, _] J'ai également essayé -explaintypes, en fait la sortie est vraiment difficile à comprendre: java.lang.Object avec com.google.common.base.Function [_, _]

+0

@Ali: il semble que vous avez seulement essayé la première suggestion. J'ai collé le code complet pour la deuxième suggestion maintenant. En outre, ajoutez la sortie de '-explaintypes' à votre question. –

+0

En fait, la sortie est assez grande, j'ai ajouté le code réel que l'on peut simplement copier coller pour reproduire le message d'erreur. S'il vous plaît laissez-moi savoir s'il y a autre chose que je fournirai. –