2016-03-07 2 views
0

Эти два термина всегда застряли у меня в голове. Являются ли они логически одинаковыми или совершенно разными? Например, в Java книге: Введение в программирование на Лян, он говорит:Является ли «эквивалент» таким же, как «равным» (или «абсолютным равным»)?

Вы можете использовать общий класс без указания конкретного типа, как это:

GenericStack stack = new GenericStack(); // raw type

Это примерно эквивалентно к

GenericStack<Object> stack = new GenericStack<Object>();

ответ

1

Существует много уровней равенства. Обычно они обозначаются словами «равный» или «эквивалентный». То, что эти слова означают, точно зависит от контекста, но обычно равенство подразумевает эквивалентность, но не наоборот.

Например, данные два куска кода и B, мы могли бы сказать, что и 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; 

не.

Что означает автор с «примерно эквивалентом», так это то, что тип raw ведет себя как GenericStack<Object> во многих случаях, но не во всех случаях. В частности, вы можете поместить в него любой объект.

Смежные вопросы