Я использую Mockito издеваться объект с методом, который возвращает не-параметризованных ArrayList, и я не могу понять, как заставить это работатьВызов перегруженного Java общий метод из Скале
Метод подписи фиктивный
public java.util.ArrayList getX()
код испытания
var mockee = mock(classOf[Mockee])
when(mockee.getX).thenReturn(Lists.newArrayList(x): ArrayList[_])
Thi s фактически составляет штраф в 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[_])
Возможно, я ошибаюсь, но я думал, что 'ArrayList [_]' в Scala не совпадает с непараметрированным ArrayList, это экзистенциальный тип, т. Е. Имеет параметр типа, но он связан в забавном месте. Я думаю, что непараметрированный тип будет 'ArrayList [AnyRef]', т.е. параметризованным 'java.lang.Object'. – Owen
Это выглядит как ошибка времени компиляции, а не ошибка времени выполнения. Экзистенциальный тип Scala 'ArrayList [_]' является его ближайшим приближением к подстановочному типу Java 'ArrayList >'. У вас на самом деле есть * raw type *, 'ArrayList'. Два вопроса SO, на которые нужно обратить внимание: [Экзистенциальные типы Scala] (http://stackoverflow.com/questions/1031042/scalas-existential-types) и [Необработанные типы и подстановочный знак ...] (http://stackoverflow.com/ вопросы/3489947/raw-types-unbounded-wilcard-and-bounded-wildcard) –
Вы правы, это ошибка времени компиляции, но не подчеркнута плагином scala. Я могу обойти это, используя 'thenAnswer (новый ответ [ArrayList [_]] {def answer (arg: InvocationOnMock) = Lists.newArrayList (x)})', но это не очень хорошо –