Как вернуть целое число при использовании дженериков? - PullRequest
0 голосов
/ 21 апреля 2020
// returns the value of the current element (or -1)
    public T GetValue()
    {
      Node<T> temp = head;
      while(temp != curr)
      {
          temp = temp.next;
          if(temp == null)
          {
              return -1;
          }
      }
      return temp.data;
    }

Мой код должен получить значение в текущем элементе и вернуть это значение. Если он не найден, вы возвращаете -1. Выполнение этого кода без оператора if дает мне исключение нулевого указателя. Я не могу запустить код с оператором if из-за обобщений.

1 Ответ

4 голосов
/ 21 апреля 2020

Вы можете вернуть -1, только если T равно Integer; но тогда это не было бы обобщенно c.

Вам нужно какое-то специальное значение, которое нельзя принять за «реальный» экземпляр T. Например, вы можете изменить тип возвращаемого значения на Optional<T>, поэтому вы можете вернуть Optional.empty(), чтобы указать, что значение не найдено.

public Optional<T> GetValue() {
  // ...
      if(temp == null)
      {
          return Optional.empty();
      }
 // ...
 return Optional.of(temp.data);

}

В качестве альтернативы, вы можете предоставьте значение «not found» конструктору вашего класса и верните его, когда что-то не найдено:

class YourClass<T> {
  private final T notFoundValue; // Assign in constructor.

  // ...

  public T GetValue() {
    // ...
      if(temp == null)
      {
          return notFoundValue;
      }
    // ...
    return temp.data;
  } 
}

Но тогда вам нужно быть очень осторожным, чтобы учесть возможность того, что notFoundValue был возвращен; сделать это явным путем возврата чего-то другого (но связанного) типа в T, такого как Optional<T>, - хороший способ гарантировать, что эта обработка имеет место.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...