Вопрос по java, generics – Странный обобщенный случай с Mockito.when () и выводом обобщенного типа

9

Я пишу тестовый пример, в котором используетсяjava.beans.PropertyDescriptor используя Mockito, и я хочу издеваться над поведениемgetPropertyType() вернуть произвольныйClass<?> объект (в моем случае,String.class). Обычно я бы сделал это, просто вызвав:

// we already did an "import static org.mockito.Mockito.*"
when(mockDescriptor.getPropertyType()).thenReturn(String.class);

Однако, как ни странно, это не компилируется:

cannot find symbol method thenReturn(java.lang.Class<java.lang.String>)

Но когда я указываю параметр типа вместо зависимости от логического вывода:

Mockito.<Class<?>>when(mockDescriptor.getPropertyType()).thenReturn(String.class);

все чертовски дорого Почему в этом случае компилятор не может правильно определить тип возвращаемого значения where ()? Мне никогда не приходилось указывать этот параметр раньше.

Ваш Ответ

1   ответ
13

PropertyDescriptor#getPropertyType() возвращает объектClass<?>, где? означает "это тип, но я не знаю, что это такое". Давайте назовем этот тип "X". Такwhen(mockDescriptor.getPropertyType()) создаетOngoingStubbing<Class<X>>чей методthenReturn(Class<X>) может принимать только предметыClass<X>, Но компилятор не знает, к какому типу относится этот «X»; есть, поэтому он будет жаловаться на то, что вы проходите вClass изany тип. Я думаю, что это та же самая причина, по которой компилятор жалуется на вызовadd(...) наCollection<?>.

Когда вы явно указываетеClass<?> для типа наwhen метод, вы не говорите, чтоmockDescriptor.getPropertyType() возвращаетClass<?>Вы говорите, чтоwhen возвращаетOngoingStubbing<Class<?>>, Затем компилятор проверяет, чтобы все, на что вы переходите,when имеет тип, который соответствуетClass<?>; посколькуgetPropertyType() возвращает & quot;Class<X>& Quot; Я упоминал ранее, это, конечно, соответствуетClass<?> Вы указали.

Так в основном

// the inferred type is Class<"some type">
Mockito.when(mockDescriptor.getPropertyType())

// the specified type is Class<"any type">
Mockito.<Class<?>>when(mockDescriptor.getPropertyType())

В моей IDE сообщение об ошибке для вашего исходного кода

The method thenReturn(Class<capture#1-of ?>) in the type OngoingStubbing<Class<capture#1-of ?>> is not applicable for the arguments (Class<String>)

Тотcapture#1-of ? является "X"; Я описал выше.

Похожие вопросы