Почему этот универсальный Java не кодирует компиляцию?

Установите атрибут required для хотя бы одного входа радиогруппы.


Настройка required для всех входов более понятна, но не нужна (если динамически не генерируются радиокнопки ).

Чтобы сгруппировать радиокнопки, все они должны иметь одинаковое значение name. Это позволяет выбирать только один за один раз и применять required для всей группы.

Select Gender:

Также обратите внимание:

Чтобы избежать путаницы в отношении того, требуется ли группа переключателей или нет, авторам рекомендуется указывать атрибут на всех переключателях в группе. В самом деле, в целом, авторам рекомендуется избегать групп радиокнопки, у которых вначале не были обнаружены элементы управления, поскольку это состояние, к которому пользователь не может вернуться, и поэтому обычно считается плохим пользовательским интерфейсом.

blockquote>

Источник

33
задан Craig P. Motlin 19 March 2009 в 13:27
поделиться

4 ответа

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

раздел From 4.8 (необработанные типы) JLS:

тип конструктора (В§8.8), метод экземпляра (В§8.8, В§9.4), или нестатическое поле (В§8.3) M необработанного типа C, который не наследован от его суперклассов или суперинтерфейсов, является стиранием своего типа в универсальном объявлении, соответствующем C. Тип статического члена необработанного типа C совпадает со своим типом в универсальном объявлении, соответствующем C.

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

public Map getMap()

, Другими словами, я думаю, что можно вообразить необработанный тип, как являющийся тем же API как универсальный тип, но со всем <X> биты удаленный от везде (в API, не реализации).

РЕДАКТИРОВАНИЕ: Этот код:

MyClass unchecked = new MyClass();
Map<String, String> map = unchecked.getMap();  // Unchecked warning, why?
String s2 = map.get("");

компиляции, потому что существует неявное, но преобразование непроверенное из сырых данных Map тип к Map<String, String>. Можно получить тот же эффект путем создания явного преобразования (который ничего не делает во время выполнения) в последнем случае:

// Compiles, but with an unchecked warning
String x = ((Map<String, String>)fail.getMap()).get("");
35
ответ дан 27 November 2019 в 18:34
поделиться

Очень интересный вопрос и очень интересный ответ Jon Skeet.

я просто хочу добавить что-то о глупости или не глупости этого поведения компилятора Java.

я думаю, что компилятор предполагает, что , если Вы не определяете параметр типа в generc классе, Вы не в состоянии (или не хотят к), используют любой параметр типа во всем . Вы могли использовать версию Java ранее, чем 5 или любить делать броски вручную.

Это не кажется настолько глупым мне.

3
ответ дан 27 November 2019 в 18:34
поделиться

Гм..., к сожалению, я не могу сказать Вам, почему это перестало работать. Но я могу дать Вам простое обходное решение:

Изменение тип fail к MyClass<?>, тогда это скомпилирует очень хорошо.

3
ответ дан 27 November 2019 в 18:34
поделиться

Универсальные типы стираются после компиляции.

, Когда Вы делаете:

Map<String, String> map = unchecked.getMap();

Вы вынуждаете состав исполнителей от Карты до Map< Строка, Строка>, и вот почему предупреждение непроверенное. Однако после этого можно сделать:

String s2 = map.get("");

, потому что карта имеет тип Map< Строка, Строка>.

Однако, когда Вы делаете

String s3 = fail.getMap().get(""); 

, Вы не бросаете fail.getMap () ни к чему, таким образом, это считается явно Картой, не Map< Строка, Строка>.

то, Что необходимо сделать в последнем, является чем-то как:

String s3 = ((Map<String, String>fail.getMap()).get("");

, который будет все еще брошенный предупреждение, но будет работать так или иначе.

1
ответ дан 27 November 2019 в 18:34
поделиться
Другие вопросы по тегам:

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