2010-07-20 3 views
6

저는 스칼라를 배우는 중입니다. 오늘은 프로젝트 중 하나에 자신을 소개 할 수있었습니다.스칼라가 무엇을 말하며 어떻게 수정합니까? [필수 : java.util.List [? 0] type? 0]

응용 프로그램은 많은 JPA/Hibernate 항목을 처리하고 Scala에서 Java 인터페이스 중 하나를 구현하기 시작했습니다. unittest-code를 스칼라로 번역하기 전까지는 모든 것이 잘되었습니다.

나는 Easymock을 많이 사용하며, 코드는 아주 자명하다. Scala는 타입이 지정되지 않은 java.util.List를 리턴하는 typed java.util.List를 반환하지 못하게하는 것이 문제라고 생각합니다. 불행히도 스칼라가 형식 매개 변수가 필요없는 무언가를 캐스트하는 방법을 모릅니다. /을 보여

코드 내 문제를 재현 : 다음과 같은 컴파일러 오류가 발생

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

: 당신은 내가 반환 javax.persistence.Query의 인터페이스를 구현하기 위해 모의가 필요 볼 수 있듯이

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

java.util.List. List[String] 같은 * cooked8 유형에 반대

+1

은 아마도'mockResult를 선언 :

나는이 문제를 해결할 수있을 것으로 기대? –

답변

11

javax.persistence.Query#getResultList원시 유형 List을 반환합니다. Java는 버전 1.5에서 표준 라이브러리의 대부분을 생성했지만 1.4 용으로 작성된 바이너리 및 소스와 역 호환되어야했습니다.

Scala 컴파일러는 이러한 불쾌한 유형을 허용하지만 List[?0] forSome { type ?0 }의 약식 인 List[_]으로 변환합니다. 이것은 실존 타입으로 알려져 있으며, 정확히 어떤 타입인지는 알지 못한다고해도 List의 엘리먼트 타입이 특정 타입이라는 것을 의미합니다!

Easymock은 andReturn의 인수가 expect에 전달 된 인수 유형과 동일한 유형이어야하며, 번거로운 존재 유형입니다. 에 후자의 목록 [_]`대신에, 그리고 느슨한`asInstanceOf` :

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

좋아요! 그것은 나를 위해 문제를 해결했습니다. 고마워! – msung