2010-07-20 19 views
6

Jestem w trakcie nauki Scali i dziś poczułem się pewny, że przedstawię ją jednemu z naszych projektów.Co Scala próbuje mi powiedzieć i jak to naprawić? [required: java.util.List [? 0] where type? 0]

Aplikacja wykonuje wiele wątków JPA/Hibernate i zacząłem implementować jeden z interfejsów Java w Scali. Wszystko poszło dobrze, dopóki nie spróbowałem przetłumaczyć jakiegoś unittest-kodu na Scalę.

Używam dużo Easymocka, kod jest dość oczywisty. Domyślam się, że problem polega na tym, że Scala nie pozwala mi zwrócić wpisanej strony java.util.List tam, gdzie oczekuje ona od typu bez typu. Niestety nie mam pojęcia, jak sprawić, by Scala rzuciła coś, czego oczekuje się parametrów typu na coś bez.

kod, który ilustruje/odtwarza mój problem:

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

która produkuje następujący błąd kompilatora:

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

Jak widać muszę makiety zaimplementować interfejs javax.persistence.Query, która zwraca a java.util.List.

+1

Być może zadeklarować 'mockResult: lista [_]' Zamiast oraz luźne 'asInstanceOf' nią w dniu? –

Odpowiedz

11

javax.persistence.Query#getResultList zwraca surowy typ List, w przeciwieństwie do * cooked8 typu jak List[String]. Java generowała dużą część standardowej biblioteki w wersji 1.5, ale musiała być kompatybilna wstecz z plikami binarnymi i źródłami napisanymi dla wersji 1.4.

Kompilator Scala toleruje takie nieprzyjemne typy, ale tłumaczy je na List[_], co jest skrótem dla List[?0] forSome { type ?0 }. Jest to znane jako typ egzystencjalny i oznacza, że ​​typ elementu Listy jest określonym rodzajem, nawet jeśli nie wiemy dokładnie, który!

Easymock wymaga, aby argument do andReturn był tego samego typu, co typ argumentu przekazanego do expect, naszego kłopotliwego typu egzystencjalnego.

Spodziewam się, że będzie to naprawić problem:

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

Świetnie! To rozwiązało problem dla mnie. Wielkie dzięki! – msung