2012-07-30 32 views
2

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

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调用它,它工作得很好。

(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}) 
+0

您正在使用哪个版本的scala?我使用的是2.9.2,你的示例代码编译得很好。 – 2012-07-30 14:25:23

+4

如果您找到了解决方案,您应该将其写为答案。 – 2012-08-01 15:28:29

+1

该解决方案效果很好。请将它添加为答案! – mdm 2016-05-16 08:36:07

回答

1

注:此问题只试图嘲笑Java方法,使用时的Mockito体现自己的解决方案是在由提问者到来,但从来没有张贴一个答案。接下来是提问者到达的解决方案:

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

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

thenReturn(when(myMock.someMethod), myEnumeration)