6

我正在学习 Scala,今天我有信心将它介绍给我们的一个项目。

该应用程序做了很多 JPA / Hibernate 的工作,我开始在 Scala 中实现 Java 接口之一。一切都很顺利,直到我尝试将一些单元测试代码翻译成 Scala。

我大量使用 Easymock,代码非常不言自明。我想问题是,Scala 不允许我返回一个类型化的 java.util.List ,它需要一个无类型的。不幸的是,我不知道如何让 Scala 将需要类型参数的东西转换为没有类型参数的东西。

说明/重现我的问题的代码:

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

这会产生以下编译器错误:

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

如您所见,我需要模拟来实现javax.persistence.Query的接口,该接口返回一个 java.util.List。

4

1 回答 1

11

javax.persistence.Query#getResultList返回原始类型List,而不是 *cooked8 类型,如List[String]. Java 在 1.5 版本中生成了大部分标准库,但必须向后兼容为 1.4 编写的二进制文件和源代码。

Scala 编译器可以容忍这种讨厌的类型,但会将其转换List[_]为 . 的简写形式List[?0] forSome { type ?0 }。这被称为存在类型,这意味着 List 的元素类型是某种特定类型,即使我们不知道具体是哪一种!

Easymock 要求 to 的andReturn参数与传递给 的参数类型相同,这是expect我们麻烦的存在类型。

我希望这将解决问题:

expect(mockQuery.getResultList.asInstanceOf[List[String]]).andReturn(mockResult)
于 2010-07-20T20:21:30.510 回答