2

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})
4

1 に答える 1

1

注: 質問者が解決策にたどり着きましたが、回答として投稿されることはありませんでした。以下は、質問者がたどり着いた解決策です。

Oderskyの本からのいくつかのヒントとmockitoの内部を使ったいくつかのハッキングでこれを解決することができました. 解決策は、?0 型をキャプチャする小さな関数を作成し、キャストを介して mockito コードに適用することです。

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

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