Каким образом Java "почти полностью номинально типизирована"?
Я прочитал из этой статьи, что "Java почти полностью номинально типизирован". Так что в Java есть структурно типизированные части.
Каковы номинальные и структурные части системы типов Java?
2 ответа
Согласно предыдущему посту того же автора - удаление типов функций:
- Существует два основных подхода к типированию: номинальный и структурный. Личность номинала основана на его имени; идентичность структурного типа основана на том, из чего он состоит (например, "tuple of int, int" или "function from int to float".)
Большинство языков выбирают в основном номинальные или в основном структурные; не так много языков, в которых успешно сочетаются номинальная и структурная типизация, кроме "по краям". Java почти полностью номинальна (за некоторыми исключениями: массивы являются структурным типом, но в нижней части всегда есть номинальный тип элемента; дженерики также имеют сочетание номинального и структурного типов, и это на самом деле является частью источника многих жалоб людей на дженерики.)
Итак, массивы и части генериков являются структурными типами.
Я думаю, что структурные типы могут быть что-то вроде <T extends A & B>
будучи супертипом <T extends A>
, или же Object[]
будучи супертипом String[][]
, Эти типы совместимости не основаны исключительно на их имени.
Насколько я могу судить, Java полностью номинально типизирована. Два объекта совместимы по типу, если они имеют одинаковый именованный тип. В Java объявлены классы:
class A {
public int value;
}
class B {
public int value;
}
не предоставляет вам ничего в плане языковых конструкций для использования равных членов, объявленных в том же порядке.
В то время как в C вы можете воспользоваться (при определенных обстоятельствах) объявлением A
& B
как struct
и они имеют одинаковую двоичную разметку, что означает, что вы можете скопировать их друг на друга и сформировать union
и использовать это совпадение.