调用不使用';t从Scala获取泛型类型

调用不使用';t从Scala获取泛型类型,scala,mockito,Scala,Mockito,我需要从Scala调用一个非常旧的Java方法。它采用java.util.Enumeration的非通用版本: public void someMethod(java.util.Enumeration e) { ... } 我尝试了以下代码来调用该方法: target.someMethod(new java.util.Enumeration[String] { def hasMoreElements = false def nextElement = throw new NoS

我需要从Scala调用一个非常旧的Java方法。它采用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})
(java.util.Enumeration[?0],[java.util.Enumeration[?0]])org.mockito.stubing.ongoingstubing[java.util.Enumeration[?0]]
(java.util.Enumeration[?0])org.mockito.stubing.ongoingstubing[java.util.Enumeration[?0]]
无法应用于(具有java.util.Enumeration[String]{def nextElement():Nothing}的java.lang.Object)
注意:解决方案由提问者提出,但从未作为答案发布。以下是提问者得出的解决方案:

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

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

thenReturn(when(myMock.someMethod), myEnumeration)

您正在使用哪个版本的scala?我使用的是2.9.2,您的示例代码编译得很好。如果您找到了解决方案,您应该将其作为答案来编写。该解决方案非常有效。请把它作为答案加上!