调用不采用 Scala 泛型类型的 Java 方法



我有一个非常旧的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})

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

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

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

相关内容

  • 没有找到相关文章