Выведенные подстановочные дженерики в ответ вводят

Как I’ve, записанный прежде :

автоматически генерировавший идентификационные теги, которые показывают, разумный номер версии невозможно сделать с инструментами DSCM как Базар, потому что everybody’s строка разработки может отличаться от всех других. Таким образом, кто-то мог обратиться к версии “1.41” файла, но Ваша версия “1.41” того файла отличается.

В основном, $Id$ не имеет никакого смысла с Базаром, Мерзавцем и другими распределенными инструментами управления исходным кодом.

16
задан Jeff Axelrod 5 May 2012 в 12:39
поделиться

1 ответ

Причина, по которой конструктор работает, заключается в том, что вы явно указываете параметры типа. Статический метод также будет работать, если вы это сделаете:

Pair<Class<?>, String> pair = Pair.<Class<?>, String>of(List.class, "hello");

Конечно, вся причина, по которой у вас есть статический метод, вероятно, заключается в том, чтобы просто получить вывод типа (который вообще не работает с конструкторами).

Проблема здесь (как вы предположили) в том, что компилятор выполняет преобразование захвата . Я считаю, что это результат [§15.12.2.6 JLS] :

  • Тип результата выбранного метода определяется следующим образом:
    • Если вызываемый метод объявлен с возвращаемым типом void, тогда результат недействителен.
    • В противном случае, если неконтролируемое преобразование было необходимо для метод применим тогда тип результата - стирание (§4.6) объявленный возвращаемый тип метода.
    • В противном случае, если вызываемый метод является универсальным, то для 1in позвольте Fi - параметры формального типа метод, пусть Ai будет фактическим типом аргументы, выведенные для метода вызов, и пусть R будет объявленным возвращаемый тип метода вызван. Тип результата получается применяя преобразование захвата (§5.1.10) в R [F1: = A1, ..., Fn: = An].
    • В противном случае тип результата получается путем применения захвата преобразование (§5.1.10) в данный тип в объявлении метода.

Если вам действительно нужен вывод, один из возможных обходных путей - это сделать что-то вроде этого:

Pair<? extends Class<?>, String> pair = Pair.of(List.class, "hello");

Переменная пара будет иметь более широкий тип, и это означает немного больше введите имя типа переменной, но, по крайней мере, вам больше не нужно приводить вызов метода.

13
ответ дан 30 November 2019 в 23:00
поделиться
Другие вопросы по тегам:

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