Например, я использую метод Measure.doubleValue(Unit<?> unit)
, который возвращает значение double
измерения, выраженное в указанном Unit
. Если я передаю ей переменную Unit<?>
, я получаю все еще очень загадочное (для меня) сообщение об ошибке:
The method
doubleValue(Unit<capture#27-of ?>) in
the type Measurable<capture#27-of ?>
is not applicable for the arguments
(Unit<capture#28-of ?>)
Буду признателен, если кто-нибудь сможет объяснить, что означает это #27-of ?
(или любое другое число), и если есть изящный способ избавиться от этого. До сих пор я удаляю <?>
и устанавливаю вызывающий метод @SuppressWarnings("unchecked")
(поэтому я передаю непроверенный Unit
вместо Unit<?>
), и все работает, как нужно, но мне просто интересно, и я ощущение, что подавление предупреждений не является хорошей практикой (разве это не похоже на пустые блоки catch?).
Спасибо!
Редактировать: добавление некоторого кода.
(извините, это довольно долго, но подробно объясняет, на чем я застрял.)
Я использую JSR-275 версия 0.9.4 (последняя версия).
Итак ... Если я напишу это (очень тупой пример):
Measure measure = Measure.valueOf("3 m");
measure = Measure.valueOf(measure.doubleValue(Unit.valueOf("km")), Unit.valueOf("km"));
System.out.println(measure);
Работает и печатает "0,0030 км". Но я получаю предупреждение " Мера является необработанным типом. Ссылки на универсальный тип Мера должны быть параметризованы
" в течение первого Measure
вхождения и предупреждения " Безопасность типов: метод doubleValue (Unit ) относится к необработанному типу Измеримый. Ссылки на универсальный тип Измеримый должны быть параметризованы
"более measure.doubleValue(Unit.valueOf("km"))
.
Увидев эти предупреждения, я подумал, что смогу скорректировать это (только первая строка):
Measure<Length> measure = Measure.valueOf("3 m");
И тогда я получаю сообщение об ошибке в правой части назначения " Несоответствие типов: невозможно преобразовать из Меры В Меру ". Он (Затмение) предлагает мне привести правильную часть к (Measure<Length>)
. Но затем в правой части появляется предупреждающее сообщение « Безопасность типа: не проверено приведение от Меры <захват № 1-из?> К Мере ». Предлагаемое исправление: @SuppressWarnings
, которого я предпочел бы избежать (я полагаю, по параноидальным причинам).
Итак, я возвращаюсь к Measure measure = Measure.valueOf("3 m");
и пытаюсь присвоить подстановочный знак Measure
, поскольку, очевидно, он не знает, что означает "3 м" в данный момент. Это может быть Length
, но также Mass
или Time
. Итак, я получаю:
Measure<?> measure = Measure.valueOf("3 m");
И нет предупреждений или ошибок в этой строке; фантастика. Но во второй строке:
measure = Measure.valueOf(measure.doubleValue(Unit.valueOf("km")), Unit.valueOf("km"));
Я получаю сообщение об ошибке для doubleValue
: " Метод doubleValue (Unit ) В типе Measurable Не применим для аргументов ( Юнит <захват № 4-из?>)". Он предлагает разыграть Unit.valueOf("km")
как (Unit<?>)
. Хорошо. Теперь я получаю сообщение об ошибке в том же месте: " Метод doubleValue (Unit ) В типе Measurable Не применим для аргументов (Unit < захватить № 5-из?>)". Обратите внимание, что числа изменились, так что это не совсем те же параметры, но по той же причине. Затем он делает то же самое предложение, которое не приводит к каким-либо изменениям в коде, поскольку это уже было сделано.
Так вот что меня беспокоит. Единственный способ заставить его работать, кажется, @SuppressWarnings
или просто игнорировать их. Разве это не странно?