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