2010-07-20 23 views
6

Je suis en train d'apprendre Scala et aujourd'hui j'étais confiant de le présenter à l'un de nos projets.Qu'est-ce que Scala essaie de me dire et comment résoudre ce problème? [required: java.util.List [? 0] où type? 0]

L'application fait beaucoup de choses JPA/Hibernate et j'ai commencé à implémenter l'une des interfaces Java dans Scala. Tout s'est bien passé, jusqu'à ce que j'essaie de traduire un code d'unittest à Scala. Je fais beaucoup d'utilisation d'Easymock, le code est assez explicite. Je suppose que le problème est, que Scala ne me permet pas de renvoyer un java.util.List typé où il attend un non typé. Malheureusement, je n'ai aucune idée de la façon de faire Scala lancer quelque chose qui attend des paramètres de type à quelque chose sans.

code qui illustre/reproduit mon problème:

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

qui produit l'erreur du compilateur suivant:

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

Comme vous pouvez le voir, je dois la maquette pour mettre en œuvre l'interface de javax.persistence.Query, qui retourne un java.util.List.

+1

Peut-être déclarer 'mockResult: Liste [_]' au lieu, et perdre les 'asInstanceOf' dernier sur? –

Répondre

11

javax.persistence.Query#getResultList retourne un type brut List, par opposition à un type * cooked8 comme List[String]. Java a généré une grande partie de la bibliothèque standard dans la version 1.5 mais devait être rétrocompatible avec les binaires et les sources écrits pour la version 1.4.

Le compilateur Scala tolère ces types méchants, mais le convertit en List[_], qui est un raccourci pour List[?0] forSome { type ?0 }. Ceci est connu comme un type existentiel, et cela signifie que le type d'élément de la liste est un type spécifique, même si nous ne savons pas exactement lequel!

Easymock nécessite que l'argument à andReturn soit du même type que le type de l'argument passé à expect, notre type existentiel gênant.

Je pense que cela va résoudre le problème:

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

Super! Cela a résolu le problème pour moi. Merci beaucoup! – msung