2010-07-20 29 views
6

Scala öğrenme sürecindeyim ve bugün projelerimizden birine tanıtmaktan kendimi emin hissettim.Scala bana ne anlatmaya çalışıyor ve bunu nasıl düzeltirim? [required: java.util.List [? 0] nerede? 0]

Uygulamada çok sayıda JPA/Hazırda Bekletme sorunu var ve Scala'daki Java arabirimlerinden birini uygulamaya başladım. Her şey yolunda gitti, bazı en güvenilir kodları Scala'ya çevirmeye çalışana kadar.

Easymock'u çok kullanıyorum, kod oldukça açıklayıcı. Sanırım sorun şu ki, Scala yazılmamış bir java.util.List yazmasına izin vermiyor. Ne yazık ki, Scala'nın tür parametrelerini olmayan bir şeye çevirmesini sağlayan bir şey yapmanın hiçbir fikrim yok./göstermektedir

Kod benim sorunu reproduces: Aşağıdaki derleyici hata üretir

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

: Eğer ben döndüren javax.persistence.Query arayüzüne uygulamak için mock ihtiyaç görebileceğiniz gibi

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

bir java.util.List. List[String] gibi * cooked8 türü olarak

+1

Belki 'mockResult beyan:

Bu sorunu çözmek bekliyoruz? –

cevap

11

javax.persistence.Query#getResultList, bir ham tip List döndürür. Java, sürüm 1.5'teki standart kitaplığın çoğunu oluşturdu, ancak ikili dosyalar ve 1.4 için yazılmış kaynaklarla geriye dönük olarak uyumlu olmalıydı.

Scala derleyicisi, bu tür kötü türlerini tolere eder, ancak List[?0] forSome { type ?0 } için kestirme olan List[_]'a çevirir. Bu varoluşsal bir tür olarak bilinir ve tam olarak hangisini bilmememize rağmen, Listenin eleman türünün belirli bir tür olduğu anlamına gelir!

Easymock, andReturn numaralı argümanın, zahmetli varoluşsal türümüz olan expect'a iletilen argümanın türüyle aynı türde olmasını gerektirir. üzerinde ikinci Liste [_] `yerine ve gevşek` asInstanceOf`:

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

Harika! Bu benim için Sorunu çözdü. Çok teşekkürler! – msung