调用不从Scala获取泛型类型的Java方法

时间:2012-07-30 14:02:21

标签: scala mockito

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

1 个答案:

答案 0 :(得分:1)

注意:解决方案是由提问者提出的,但从未发布过答案。以下是提问者到达的解决方案:

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

CREATE OR REPLACE PACKAGE cop_cow_scripts AS
TYPE arr_claims_t IS VARRAY(15000) OF VARCHAR2(10);
TYPE arr_sql_t IS VARRAY(500) OF VARCHAR2(1000);

-- declaring procedure that will call COP_DATALOAD_V2 and COW_DATALOAD
PROCEDURE COP_COW_DATALOAD_V2(claims_array arr_claims_t, sql_array arr_sql_t);

END cop_cow_scripts;


CREATE OR REPLACE PACKAGE BODY cop_cow_scripts AS


sql_statments arr_sql := arr_sql();--initialize a empty lis