2010-01-29 17 views
6

Ho il seguente codice per la costruzione di una cache utilizzando collezioni Google:Implementazione di un interfaccia Java in 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 
    } 
    }) 

E io sto ottenendo il seguente messaggio di errore:

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] { 
^

Mi chiedo perché il i tipi non corrispondono?

Il codice attuale è:

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) 
} 

Cordiali saluti, Ali

PS - sto usando google-collezioni v1

risposta

7

È necessario fornire i parametri del tipo alla chiamata del metodo finale. Stai attraversando l'interfaccia di tipo raw e scala non può ricostruire le informazioni sul tipo.

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

fa le seguenti opere?

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

Se questo non dovesse funzionare, si potrebbe desiderare di ottenere la dichiarazione come è adesso, e quindi aggiungere un : com.google.common.base.Function[_, _] dopo che, in questo modo:

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[_, _]) 

Ho sentito dire che alcuni Le cose di Google usano i tipi non elaborati, che sono piuttosto difficili da integrare bene con Scala. E, in effetti, dovrebbe essere bandito di nuovo all'inferno, da dove sono venuti, ma questo è solo imho.

Inoltre, se fosse possibile compilarlo con -explaintypes, potremmo ottenere una migliore idea di ciò che sta fallendo.

+0

non funziona, ora ottengo questo errore: tipo classe richiesta ma com.google.common.base.Function [_, _] trovato nuova com.google.common.base.Function [ _, _] Ho anche provato -explaintypes, in realtà l'output è davvero difficile da comprendere: java.lang.Object con com.google.common.base.Function [_, _]

+0

@Ali: sembra che tu abbia provato solo il primo suggerimento. Ho incollato il codice completo per il secondo suggerimento ora. Inoltre, per favore aggiungi l'output di '-explaintypes' alla tua domanda. –

+0

In realtà l'output è abbastanza grande, ho aggiunto il codice reale che si può semplicemente copiare incollare per riprodurre il messaggio di errore. Per favore fatemi sapere se c'è qualcos'altro che fornirò. –

Problemi correlati