Является ли "эквивалент" таким же, как "равно" (или "абсолютно равный")?
Эти два термина всегда запоминались. Они логически одинаковы или совершенно разные? Например, в книге Java: Введение в программирование Ляна он говорит:
Вы можете использовать универсальный класс без указания конкретного типа, например:
GenericStack stack = new GenericStack(); // raw type
Это примерно эквивалентно
GenericStack<Object> stack = new GenericStack<Object>();
1 ответ
Есть много уровней равенства. Обычно они обозначаются словами "равно" или "эквивалент". Что именно означают эти слова, зависит от контекста, но обычно равенство подразумевает эквивалентность, а не наоборот.
Например, учитывая две части кода A и B, мы можем сказать, что A и B равны, если они состоят из абсолютно одинаковых символов, и сказать, что они эквивалентны, если мы всегда можем заменить A на B, и наоборот, без изменение поведения программы. Если мы сделаем это,
int i;
i = 10;
а также
int i = 10;
не равны, но эквивалентны.
Два фрагмента кода в вашей цитате названы автором "примерно эквивалентными". Слово "грубо" говорит о том, что они совсем не эквивалентны. И действительно:
GenericStack stack = new GenericStack();
GenericStack<String> stack2 = stack;
компилирует (с предупреждением), тогда как
GenericStack<Object> stack = new GenericStack<Object>();
GenericStack<String> stack2 = stack;
не.
Автор имеет в виду "примерно эквивалентно" то, что необработанный тип ведет себя как GenericStack<Object>
во многих, но не во всех случаях. В частности, вы можете поместить в него любой предмет.