Каким образом Java "почти полностью номинально типизирована"?

Я прочитал из этой статьи, что "Java почти полностью номинально типизирован". Так что в Java есть структурно типизированные части.

Каковы номинальные и структурные части системы типов Java?

2 ответа

Решение

Согласно предыдущему посту того же автора - удаление типов функций:

  1. Существует два основных подхода к типированию: номинальный и структурный. Личность номинала основана на его имени; идентичность структурного типа основана на том, из чего он состоит (например, "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 и использовать это совпадение.

Другие вопросы по тегам