什么是Scala想要告诉我,我该如何解决?[需要:java.util.List [?0],其中类型为?0]

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。


1
也许应该声明 mockResult: List[_],然后放弃使用 asInstanceOf - Daniel C. Sobral
1个回答

11

javax.persistence.Query#getResultList 返回一个原始类型的 List,而不是像 List[String] 这样的 *烹调8* 类型。Java 在1.5版本中通用化了大部分标准库,但必须向后兼容针对1.4编写的二进制和源代码。

Scala编译器接受这种恶心的类型,但将其转换为 List[_],这是 List[?0] forSome { type ?0 } 的简写。这被称为存在类型,它意味着列表的元素类型是某个特定的类型,尽管我们不知道确切的类型!

Easymock 要求 andReturn 的参数与我们麻烦的存在类型所传递的参数类型相同。

我希望这会解决问题:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接