2012-07-30 34 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)