Для назначения Java "x = y" требует ли компилятор Java, что объявленный тип x является супертипом типа y (включая тот же тип)? - PullRequest
0 голосов
/ 04 января 2012

Сформулированный по-другому,

Не могли бы вы привести пример присваивания JAVA, x = y, чтобы объявленный тип "x" не был супертипом типа "y"?

Напомним, что объявленным типом является «T», если x объявлен как «T x».(супертип включает "тот же тип" по соглашению.)

Спасибо.

[Редактировать]

Ответы [ 4 ]

2 голосов
/ 04 января 2012

Ответ - нет, согласно спецификации языка Java ниже.См. Текст полужирный .

Присвоение значения ссылочного типа времени компиляции S (источник) переменной ссылочного типа времени компиляции T (целевой) проверяется какследует:

Если S является типом класса:

  • Если T является типом класса, то S должен быть того же класса, что и T, или S должен бытьподкласс T, или возникает ошибка времени компиляции.
  • Если T является типом интерфейса, то S должен реализовать интерфейс T, или возникает ошибка времени компиляции.
  • ЕслиT является типом массива, тогда происходит ошибка времени компиляции.

Если S является типом интерфейса:

  • Если T является типом класса, то T должен быть Object, иначе произойдет ошибка времени компиляции.
  • Если T является типом интерфейса, то T должен быть либо тем же интерфейсом, что и S, либо суперинтерфейсом S, либо произойдет ошибка времени компиляции.
  • Если T является типом массива, то возникает ошибка времени компиляции.

Если S является массивом типа SC [], то есть массивом компонентов типа SC:

  • Если T является типом класса, то T должен бытьОбъект или ошибка во время компиляции.
  • Если T является типом интерфейса, то возникает ошибка времени компиляции, если только T не является типом java.io.Serializable или типом Cloneable, единственными интерфейсами, реализованными массивами.
  • Если T является массивом типа TC [], то есть массивом компонентов типа TC, то возникает ошибка времени компиляции, если не выполняется одно из следующих условий:

    • TC и SC - это один и тот же примитивный тип.
    • TC и SC оба являются ссылочными типами, а тип SC назначается TC, что определяется рекурсивным применением этих правил времени компиляции для присвоения.
1 голос
/ 04 января 2012

Ну, зависит от того, что вы подразумеваете под «супертипом». Однако, если он используется в качестве общего термина ООП: Object[] arr = new Integer[5];

Для обсуждения того, почему это недостаток системы типов, см., Например, http://c2.com/cgi/wiki?JavaArraysBreakTypeSafety

1 голос
/ 04 января 2012

При назначении LHS должен быть типом или RHS или типом super .Под супертипом подразумеваются также ковариантные типы массивов: String [] to Object [] (никогда не используйте это!).Или может иметь место расширение (примитивные типы): присвоение int float.Или может произойти бокс : от целого до целого, от целого до целого.

0 голосов
/ 04 января 2012

Конечно:

Object o = new Object();
Object o2 = o;

В этом примере тип o2 не является правильным супертипом типа o. Однако что касается цели вопроса (вероятно), см. Принятый ответ.

...