Представьте, что C ++ использует ()
вместо <>
для шаблонов.Теперь рассмотрим следующую строку кода:
foo(bar)*bang;
Это:
- Объявление локальной переменной
bang
, тип которой является указателем на тип шаблона foo
с аргументом типаbar
? - Вызов функции
foo
, передача bar
, умножение результата на bang
?
Это грамматически неоднозначно.Мы могли бы настроить грамматику так, чтобы она всегда предпочитала одну над другой, но это делает (и без того мучительно сложную) грамматику еще более привлекательной.Хуже того, какой бы способ вы ни выбрали, пользователи, вероятно, будут иногда угадывать неправильно.
Так что для C ++ имеет смысл использовать другой символ группировки для шаблонов.
Java затем просто следует по стопам C ++.
Большинство проблем здесь связано с решением C не иметь явного синтаксиса для объявления переменных, а вместо этого просто использовать аннотацию типа, чтобы неявно означать «создать новую переменную этого типа».Такие языки, как Scala, в которых для переменных есть явные ключевые слова (var
и val
), обладают большей свободой благодаря синтаксису объявления типов, поэтому они могут использовать []
для обобщений.