什么是Scala试图告诉我,我该如何解决这个问题?[required:java.util.List [?0] where type?0]

msu*_*ung 6 java interop scala easymock typing

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

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

我使用了很多Easymock,代码很自我解释.我想问题是,Scala不允许我返回一个类型化的java.util.List,它需要一个无类型的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)
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

ret*_*nym 11

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

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

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

我希望这可以解决问题:

expect(mockQuery.getResultList.asInstanceOf[List[String]]).andReturn(mockResult)
Run Code Online (Sandbox Code Playgroud)