Почему разработчики языка использовали угловые скобки вместо скобок? - PullRequest
3 голосов
/ 17 марта 2012

Читая API-документы javase, я заметил, что почти все методы в структуре коллекций используют угловые скобки. Например:

Collection<String> c = new HashSet<String>();

или

Map<String, Integer> m = new HashMap<String, Integer>();

На первый взгляд они выполняют ту же функцию, что и набор скобок. Я до сих пор недостаточно знаю язык Java, чтобы увидеть всеобъемлющее соединение, где используются угловые скобки и почему это может иметь место.

Мой вопрос, в частности: Имеет ли смысл то, как угловые скобки интерпретируются JVM в отличие от многогранников? Или это обычная практика для нескольких языков?

Ответы [ 7 ]

8 голосов
/ 17 марта 2012

Угловые скобки пришли с введением обобщений в Java 1.5

Поскольку это более позднее дополнение к существующему языку, я думаю, угловые скобки были выбраны таким образом, чтобы провести четкое различие с существующими скобками (вызовы методов и конструкторов), квадратными скобками (доступ к элементу массива) и фигурными скобками (разделители блоков). ). Я бы сказал, что угловые скобки - это логичный выбор.

3 голосов
/ 17 марта 2012

Я предполагаю, что они используются в Java, потому что они используются в C++, как и все от int до void.

Найдены некоторые интересные ссылки, хотя и частичные:

Из Шаблоны C ++: полное руководство Дэвид Вандевурде, Николай М. Йосуттис, стр. 139 :

Относительно рано во время разработки шаблонов, Том Пеннелло - широкопризнанный эксперт по анализу, работающий на Metaware - отметил некоторые проблемы, связанные с угловыми скобками.Страуструп также комментирует эту тему в [DnE] и утверждает, что люди предпочитают читать угловые скобки, а не круглые скобки.Однако существуют и другие возможности, и Пеннелло специально предложил фигурные скобки (например, List {:: X}) на совещании по стандартам C ++ в 1991 году (проходившем в Далласе). В то время масштабы проблемы были более ограниченными, поскольку шаблоны были вложены в другие.шаблоны - так называемые вложенные шаблоны - были недействительными, и поэтому обсуждение Раздела 9.3.3 на стр. 132 было в значительной степени неактуальным.В следствии.Комитет отклонил предложение о замене угловых скобок.

Так что, возможно, я ошибся, что угловые скобки использовались для помощи синтаксическому анализатору, возможно, они использовались для помощи программисту, потому что Бьярн Страуструп думалони были лучше.

3 голосов
/ 17 марта 2012

Скобки уже зарезервированы для вызовов методов и группировки выражений. Угловые скобки используются для параметров общего типа.

Если бы скобки использовались для обоих, вещи могли бы стать неоднозначными, если бы не компилятор, то по крайней мере для читателя.

3 голосов
/ 17 марта 2012

Имеет ли значение то, как угловые скобки интерпретируются JVM в отличие от постоянных?

Ни одна из них не интерпретируется JVM [ни скобки, ни угловые скобки], скобки и угловые скобки анализируются во время компиляции, и JVM их не видит, так как JVM активен во время выполнения.

В качестве примечаний:

  1. <> используются для обобщений , и их использование также распространено в других языках, таких как C ++.

  2. Вы ссылаетесь на new HashSet<String>(); как на метод - это не так, он вызывает конструктор. Конструктор не метод.

0 голосов
/ 20 марта 2012

Представьте, что C ++ использует () вместо <> для шаблонов.Теперь рассмотрим следующую строку кода:

foo(bar)*bang;

Это:

  1. Объявление локальной переменной bang, тип которой является указателем на тип шаблона foo с аргументом типаbar?
  2. Вызов функции foo, передача bar, умножение результата на bang?

Это грамматически неоднозначно.Мы могли бы настроить грамматику так, чтобы она всегда предпочитала одну над другой, но это делает (и без того мучительно сложную) грамматику еще более привлекательной.Хуже того, какой бы способ вы ни выбрали, пользователи, вероятно, будут иногда угадывать неправильно.

Так что для C ++ имеет смысл использовать другой символ группировки для шаблонов.

Java затем просто следует по стопам C ++.

Большинство проблем здесь связано с решением C не иметь явного синтаксиса для объявления переменных, а вместо этого просто использовать аннотацию типа, чтобы неявно означать «создать новую переменную этого типа».Такие языки, как Scala, в которых для переменных есть явные ключевые слова (var и val), обладают большей свободой благодаря синтаксису объявления типов, поэтому они могут использовать [] для обобщений.

0 голосов
/ 17 марта 2012

Угловые скобки используются для обозначения списков параметров типа для полиморфных («универсальных») классов и методов. Это очень разные звери из списка параметров значения (в скобках). Если бы они были одинаковыми, то представьте, что у вас есть выражение new Foo(bar) ... Как бы синтаксический анализатор это интерпретировал? Является ли bar именем типа или именем переменной?

0 голосов
/ 17 марта 2012

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

Простейший вариант использования дженериков - в специализированных коллекциях, чтобы указать, что они должны содержать только объекты определенного типа.

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

...