2010-01-29 11 views
6

he el siguiente código para la construcción de una memoria caché utilizando Google Colecciones:La implementación de una interfaz Java en 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 
    } 
    }) 

Y yo estoy recibiendo el mensaje de error:

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

Me pregunto por qué el tipos no coinciden?

El código actual es:

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

Saludos cordiales, Ali

PS - Estoy usando google-colecciones v1

Respuesta

7

Debe proporcionar parámetros de tipo para la llamada al método final. Está pasando por la interfaz de tipo sin formato y Scala no puede reconstruir la información de 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

realiza las siguientes obras?

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

Si eso no funciona, puede que desee mantener la declaración, ya que es en este momento, y luego añadir un : com.google.common.base.Function[_, _] después de que, como este:

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

He oído que algunos Las cosas de Google usan tipos crudos, que son bastante difíciles de integrar bien con Scala. Y, de hecho, deberían ser desterrados al infierno, de donde vinieron, pero eso es solo un infierno.

Además, si puede compilar eso con -explaintypes, podemos tener una mejor idea de lo que está fallando.

+0

no funciona, ahora me sale este error: tipo clase requerida, pero com.google.common.base.Function [_, _] encontró nueva com.google.common.base.Function [ _, _] También probé -explicar los tipos, en realidad el resultado es realmente difícil de entender: java.lang.Object con com.google.common.base.Function [_, _]

+0

@Ali: parece que solo has probado la primera sugerencia. Pegué el código completo para la segunda sugerencia ahora. Además, agregue el resultado de '-explaintypes' a su pregunta. –

+0

En realidad, la salida es bastante grande, agregué el código real que uno puede copiar y pegar para reproducir el mensaje de error. Por favor, avíseme si hay algo más que proporcionaré. –

Cuestiones relacionadas