从scala调用重载java泛型方法

从scala调用重载java泛型方法,java,generics,scala,mockito,Java,Generics,Scala,Mockito,我使用Mockito来模拟一个对象,方法返回一个未参数化的ArrayList,我不知道如何让它工作 模拟的方法签名 public java.util.ArrayList getX() 测试代码 var mockee = mock(classOf[Mockee]) when(mockee.getX).thenReturn(Lists.newArrayList(x): ArrayList[_]) 这实际上在IntelliJ中编译得很好,但在运行时抛出: [error] ....scala:89:

我使用Mockito来模拟一个对象,方法返回一个未参数化的ArrayList,我不知道如何让它工作

模拟的方法签名

public java.util.ArrayList getX()
测试代码

var mockee = mock(classOf[Mockee])
when(mockee.getX).thenReturn(Lists.newArrayList(x): ArrayList[_])
这实际上在IntelliJ中编译得很好,但在运行时抛出:

[error] ....scala:89: overloaded method value thenReturn with alternatives:
[error]   (java.util.ArrayList[?0],<repeated...>[java.util.ArrayList[?0]])org.mockito.stubbing.OngoingStubbing[java.util.ArrayList[?0]] <and>
[error]   (java.util.ArrayList[?0])org.mockito.stubbing.OngoingStubbing[java.util.ArrayList[?0]]
[error]  cannot be applied to (java.util.ArrayList[_$1])
[error]       when(mockee.getX).thenReturn(Lists.newArrayList(x): ArrayList[_])
[error]…scala:89:重载方法值,然后返回可选值:
[错误](java.util.ArrayList[?0],[java.util.ArrayList[?0]])org.mockito.stubing.ongoingstubing[java.util.ArrayList[?0]]
[错误](java.util.ArrayList[?0])org.mockito.stubing.ongoingstubing[java.util.ArrayList[?0]]
[错误]无法应用于(java.util.ArrayList[\u$1])
[error]when(mockee.getX).thenReturn(Lists.newArrayList(x):ArrayList[\u])

以下内容对我很有用:

val mockee = mock(classOf[Mockee])
when[ArrayList[_]](mockee.getX).thenReturn(Lists.newArrayList)

假设“Lists”类来自Google collections(现在的Guava)。

我可能错了,但我认为Scala中的
ArrayList[\u]
与未经参数化的ArrayList不同,它是一种存在类型——即它有一个类型参数,但它绑定在一个有趣的地方。我认为未参数化的类型应该是
ArrayList[AnyRef]
ie,由
java.lang.Object
参数化。这看起来像是编译时错误,而不是运行时错误。Scala的存在类型
ArrayList[\u]
最接近Java的通配符类型
ArrayList
。实际上您有一个原始类型,
ArrayList
。有两个问题需要研究:您是对的,这是一个编译时错误,但scala插件没有突出显示。我可以通过使用
thenAnswer(new-Answer[ArrayList[]]{def-Answer(arg:invocationMock)=Lists.newArrayList(x)})解决这个问题
但这不是很完美-我从未想过添加方法参数