Я могу преобразовать следующий код для использования дженериков?

Я попробовал метод setTimeout(), подробно описанный выше ...

.catch(function(err) { setTimeout(function() { throw err; }); });

Раздражающе, я обнаружил, что это абсолютно неуместно. Поскольку он выдает асинхронную ошибку, вы не можете обернуть ее внутри оператора try/catch, потому что catch перестанет прослушиваться по ошибке времени.

Я вернул только использование прослушивателя который отлично работал и, поскольку он предназначен для использования JavaScript, был высоко проверяемым.

return new Promise((resolve, reject) => {
    reject("err");
}).catch(err => {
    this.emit("uncaughtException", err);

    /* Throw so the promise is still rejected for testing */
    throw err;
});
18
задан Steve Bosman 12 September 2008 в 21:15
поделиться

5 ответов

Измените его на:

protected static <T extends Comparable<T>> int nullCompare(T o1, T o2) {

Вам нужно это, потому что Сопоставимый самостоятельно универсальный тип.

21
ответ дан 30 November 2019 в 08:16
поделиться

Я не уверен, что genericizing этот метод имеет смысл. В настоящее время метод работает над любым довольно Сопоставимым; если Вы genericize это необходимо будет реализовать его (с точно тем же кодом) многократно. Иногда возможно сравнить два объекта, которые не имеют общего предка, и любая универсальная версия не позволит это.

Путем добавления дженериков Вы не добавите безопасности к коду; любые проблемы безопасности произойдут в вызове с compareTo. То, что я предложил бы, просто подавляет предупреждение. Это действительно не предупреждает Вас ни о чем полезном.

0
ответ дан 30 November 2019 в 08:16
поделиться

Не может отредактировать так, я должен отправить свой ответ.

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

protected static <T extends Comparable<? super T>> int nullCompare(T o1, T o2) {

Обратите внимание на то, что Comparable<? супер T> , который делает более гибким. Вы будете видеть то же определение метода на Collections.sort

public static <T extends Comparable<? super T>> void sort(List<T> list) {
2
ответ дан 30 November 2019 в 08:16
поделиться

Вот нечетный случай:

static class A {
    ...
}

static class B extends A implements Comparable<A> {
    public int compareTo(A o) {
        return ...;
    }
}

К счастью код как тот выше редок, но nullCompare () не будет поддерживать сравнение бакалавра наук, если не будет указано, что Сопоставимый может относиться к T или любому суперклассу этого :

protected static <T extends Comparable<? super T>> int nullCompare(T o1, T o2) {

Даже при том, что большинство людей никогда не будет извлекать выгоду из вышеупомянутой тонкой настройки, она может пригодиться при разработке API для экспортируемых библиотек.

5
ответ дан 30 November 2019 в 08:16
поделиться

Чтобы сделать его еще более общим, вы можете даже позволить ему работать для двух разных типов. = P

  /**
   * Compare two Comparables, treat nulls as -infinity.
   * @param o1
   * @param o2
   * @return -1 if o1&lt;o2, 0 if o1==o2, 1 if o1&gt;o2
   */
  protected static <T> int nullCompare(Comparable<? super T> o1, T o2) {
    if (o1 == null) {
      if (o2 == null) {
        return 0;
      } else {
        return -1;
      }
    } else if (o2 == null) {
      return 1;
    } else {
      return o1.compareTo(o2);
    }
  }
0
ответ дан 30 November 2019 в 08:16
поделиться
Другие вопросы по тегам:

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