2

我有一个非常古老的 Java 方法,需要从 Scala 调用。它采用 java.util.Enumeration 的非泛型版本:

public void someMethod(java.util.Enumeration e) {
    ...
}

我尝试了以下代码来调用该方法:

target.someMethod(new java.util.Enumeration[String] {
  def hasMoreElements = false
  def nextElement = throw new NoSuchElementException()
})

但是,这会导致编译器错误:

found: java.lang.Object with java.util.Enumeration[String]
required: java.util.Enumeration[?0] where type ?0

我找到了很多例子来处理 Java 方法返回非泛型值并且您需要在 Scala 中使用泛型类型来处理它的情况。我找不到任何涵盖这种相反情况的东西,我们需要传递非泛型类型。这可能吗?

更多信息 我在 Java 中创建了一个实现并从 Scala 中调用它,它工作得很好。该问题仅在尝试使用 mockito 模拟 Java 方法时表现出来:

   (java.util.Enumeration[?0],<repeated...>[java.util.Enumeration[?0]])org.mockito.stubbing.OngoingStubbing[java.util.Enumeration[?0]] <and>
   (java.util.Enumeration[?0])org.mockito.stubbing.OngoingStubbing[java.util.Enumeration[?0]]
 cannot be applied to (java.lang.Object with java.util.Enumeration[String]{def nextElement(): Nothing})
4

1 回答 1

1

注意:解决方案是由提问者提出的,但从未作为答案发布。以下是提问者得出的解决方案:

通过 Odersky 书中的一些提示和对 mockito 内部结构的一些黑客攻击,设法解决了这个问题。解决方案是构建一个捕获 ?0 类型的小函数,并通过强制转换将其应用于模拟代码:

def thenReturn[T](target: OngoingStubbing[T], result: Any) = 
  target.thenReturn(result.asInstanceOf[T])

thenReturn(when(myMock.someMethod), myEnumeration)
于 2016-06-29T13:44:18.387 回答