2010-07-20 7 views
6

Estoy en el proceso de aprender Scala y hoy me sentí seguro de presentarlo en uno de nuestros proyectos.¿Qué intenta Scala decirme y cómo soluciono esto? [required: java.util.List [? 0] where type? 0]

La aplicación hace muchas cosas de JPA/Hibernate y comencé a implementar una de las interfaces de Java en Scala. Todo fue bien, hasta que intenté traducir algún código de prueba de unidad a Scala.

Hago un gran uso de Easymock, el código es bastante auto explicativo. Supongo que el problema es que Scala no me permite devolver un java.util.List mecanografiado en el que espera un tipo no escrito. Lamentablemente, no tengo idea de cómo hacer que Scala emita algo que espere que los parámetros de tipo sean algo sin él.

de código que muestra/reproduce mi problema:

package some.package.name 

import java.util.ArrayList 
import java.util.List 
import javax.persistence.Query 
import org.easymock.EasyMock._ 
import org.junit.Assert._ 
import org.junit.Test 

class MyGreatScalaTest { 

    @Test 
    def testSomething() : Unit = { 

    val mockQuery: Query = createMock(classOf[Query]) 
    val mockResult: List[String] = new ArrayList[String] 
    mockResult.add("great value") 

    expect(mockQuery.getResultList).andReturn(mockResult) 
    replay(mockQuery) 

    assertEquals(
     (mockQuery.getResultList.asInstanceOf[List[String]]).get(0), 
     "great value") 

    verify(mockQuery) 
    } 
} 

que produce el siguiente error de compilación:

[WARNING] found : java.util.List[String] 
[WARNING] required: java.util.List[?0] where type ?0 
[WARNING]  expect(mockQuery.getResultList).andReturn(mockResult) 
[WARNING]            ^ 

Como se puede ver que necesito la maqueta para implementar la interfaz de javax.persistence.Query, que devuelve una java.util.List.

+1

declaran Quizás 'mockResult: Lista [_]' en lugar, y desatar las últimas 'asInstanceOf' en? –

Respuesta

11

javax.persistence.Query#getResultList devuelve una prima tipo List, a diferencia de un * Tipo cooked8 como List[String]. Java generó gran parte de la biblioteca estándar en la versión 1.5, pero tenía que ser compatible con versiones anteriores de binarios y fuentes escritas para 1.4.

El compilador de Scala tolera esos tipos desagradables, pero lo traduce a List[_], que es la abreviatura de List[?0] forSome { type ?0 }. Esto se conoce como un tipo existencial, y significa que el tipo de elemento de la Lista es de algún tipo específico, ¡aunque no sepamos exactamente cuál!

Easymock requiere que el argumento andReturn sea del mismo tipo que el tipo del argumento pasado a expect, nuestro problemático tipo existencial.

espero que esto se solucionará el problema:

expect(mockQuery.getResultList.asInstanceOf[List[String]]).andReturn(mockResult) 
+0

¡Genial! Eso resolvió el problema para mí. ¡Muchas gracias! – msung

Cuestiones relacionadas