Как я обращаюсь с отрицанием при преобразовании из формы Infix в Postfix и оценке [duplicate]

Что такое типы raw в Java и почему я часто слышу, что они не должны использоваться в новом коде?

blockquote>

Необработанные типы - это древняя история Java язык. В начале были Collections, и они больше не держали Objects и ничего меньше. Каждая операция на Collections требовала отличных от Object желаемого типа.

List aList = new ArrayList();
String s = "Hello World!";
aList.add(s);
String c = (String)aList.get(0);

Хотя это продолжалось большую часть времени, произошли ошибки

List aNumberList = new ArrayList();
String one = "1";//Number one
aNumberList.add(one);
Integer iOne = (Integer)aNumberList.get(0);//Insert ClassCastException here

Старый нетривиальные коллекции не могли обеспечить безопасность типов, поэтому программисту приходилось запоминать то, что он хранил в коллекции. Генераторы, изобретенные, чтобы обойти это ограничение, разработчик объявит сохраненный тип один раз, и компилятор сделает это вместо этого.

List aNumberList = new ArrayList();
aNumberList.add("one");
Integer iOne = aNumberList.get(0);//Compile time error
String sOne = aNumberList.get(0);//works fine

Для сравнения:

// Old style collections now known as raw types
List aList = new ArrayList(); //Could contain anything
// New style collections with Generics
List aList = new ArrayList(); //Contains only Strings

Более сложный Интерфейс Compareable:

//raw, not type save can compare with Other classes
class MyCompareAble implements CompareAble
{
   int id;
   public int compareTo(Object other)
   {return this.id - ((MyCompareAble)other).id;}
}
//Generic
class MyCompareAble implements CompareAble
{
   int id;
   public int compareTo(MyCompareAble other)
   {return this.id - other.id;}
}

Обратите внимание, что невозможно реализовать интерфейс CompareAble с compareTo(MyCompareAble) с необработанными типами. Почему вы не должны их использовать:

  • Любое Object, хранящееся в Collection, должно быть выполнено до его использования
  • Использование обобщений позволяет проверять время компиляции
  • Использование исходных типов - это то же самое, что и сохранение каждого значения как Object

Что делает компилятор: Дженерики обратно совместимы, они используют одни и те же классы java, типы делают.

List someStrings = new ArrayList();
someStrings.add("one");
String one = someStrings.get(0);

Будет скомпилирован как:

List someStrings = new ArrayList();
someStrings.add("one"); 
String one = (String)someStrings.get(0);

Это тот же код, который вы бы написали, если вы использовали исходные типы напрямую. Думаю, я не уверен, что происходит с интерфейсом CompareAble, я предполагаю, что он создает две функции compareTo, одна из которых принимает MyCompareAble, а другая принимает Object и передает ее первой после ее литья.

Каковы альтернативы сырым типам: используйте generics

8
задан Guy Coder 12 December 2013 в 16:03
поделиться

1 ответ

Как я это делал много лет назад, был изобретен новый оператор для моего постфиксного выражения. Поэтому, когда я столкнулся с унарным минусом в инфиксе, я бы преобразовал его в #. Поэтому мой постфикс для a + -b стал ab#+.

И, конечно, мой оценщик должен был знать, что # только выталкивает один операнд.

Тип зависит от того, как вы используете постфиксное выражение после его создания. Если вы хотите отобразить его, то ваш специальный # оператор, вероятно, смутит людей. Но если вы просто используете его внутри (я был), то он отлично работает.

6
ответ дан Jim Mischel 21 August 2018 в 06:33
поделиться
  • 1
    Я тоже это делаю. Единственный способ, которым я могу определить, что я «столкнулся с унарным минусом в инфикс», заключается в том, чтобы поддерживать булевский контекст, который определяет, будет ли следующий оператор или операнд. Я хотел бы знать, что другие сделали, чтобы решить, когда дефис унарный или двоичный. – A. I. Breveleri 27 November 2013 в 20:07
  • 2
    @ A.I.Breveleri: Если вы используете парсер рекурсивного спуска для инфикса, вы можете распознать унарный оператор без явного сохранения состояния. См., Например, engr.mun.ca/~theo/Misc/exp_parsing.htm . – Jim Mischel 27 November 2013 в 21:25
Другие вопросы по тегам:

Похожие вопросы: