Как добавить файл typings.d.ts в проект Angular 7?

как метод выводит тип

blockquote>

Это не так. Общие методы не вызывают их общие типы - вот почему T называется параметром типа . Вызывающий метод предоставляет аргумент типа для T. Когда это произойдет, может быть выведено компилятором на основе контекста аргументов вызова метода и целевого типа.

Например:

Set c = Collections.emptySet();

emptySet объявляет параметр типа T, не принимает аргументов и возвращает Set. Здесь компилятор сообщает T как String на основе целевого типа Set.

Другой пример:

Collections.singleton("asdf");

singleton объявляет параметр типа T, принимает значение T и возвращает Set. Здесь нет целевого типа, но компилятор сообщает T как String на основе аргумента "asdf".

Но типичный вывод типа - это просто удобство. Без него мы все равно могли бы использовать свидетелей типа типа для явного предоставления аргументов типа:

Set c = Collections.emptySet();
Collections.singleton("asdf");

Это приводит нас к вашей сигнатуре метода:

public  void fromJsonArray(String jsonString, Type tToken)

fromJsonArray объявляет параметр типа T, но не возвращает ничего, связанного с типом T, или принимает аргументы, относящиеся к T. При вызове fromJsonArray компилятор не имеет информации, из которой следует вывести T. Его аргумент типа по умолчанию будет равен его верхней границе Object, если не используется тип свидетеля:

myObj.fromJsonArray(jsonString, tToken);

Но это не имеет значения, поскольку не влияет на поведение вызова метода или его компиляции. T бессмысленна * и может быть удалена из объявления fromJsonArray.

как компилятор присваивает значение, возвращаемое методом fromJson, переменная list, тип которой i не указана?

blockquote>

Вот источник Gson.fromJson(String, Type) :

@SuppressWarnings("unchecked")
public  T fromJson(String json, Type typeOfT) throws JsonParseException {
    StringReader reader = new StringReader(json);
    T target = (T) fromJson(reader, typeOfT);
    return target;
}

Вы может видеть, что он объявляет произвольный параметр типа T и отбрасывает десериализованный объект на T. Это известно как unchecked cast , потому что он не будет работать быстро, если это неправильно. Это потому, что T был удален во время выполнения. Вы можете видеть, что код подавляет предупреждение об этом, потому что это, как правило, плохая идея. Не ограничивая то, что T основано на аргументах метода, код Gson эффективно уступил контроль над ним вызывающему. Если вы написали:

List list = g.fromJson(jsonString, tToken);

, но tToken представлены HashSet, вы получите ClassCastException в этой строке во время выполнения. Хуже того, если tToken представлен ArrayList, он даже не потерпит неудачу в этой строке, потому что JVM увидит только List и разрешит выполнение задания. A ClassCastException будет выпущен спустя некоторое время, как только ваш код попытается обработать элементы Integer в списке, такие как String s (и исключение будет путать с отладкой).

Итак, чтобы ответить на ваш вопрос о назначении компилятор позволяет присваивать результат fromJson всем, что угодно. Это зависит от вас, чтобы это было правильно.

Вы можете спросить: почему Gson делает непроверенный бросок и разрешает небезопасный код? Ответ заключается в том, что это удобство, связанное с языковыми ограничениями. Их другая подпись более безопасна:

public  T fromJson(String json, Class classOfT)

Но нет способа представить общие типы с помощью Class - no List.class, например. Только Type может это сделать, и он не является общим. fromJson может потребовать TypeToken, но есть другие способы получить Type, поэтому это будет ограничительным.

Возврат Object и принуждение вызывающего к выполнению непроверенного акта были более прозрачными, но разработчики Gson, вероятно, хотели избежать этого «уродства».

3
задан Jane Wayne 20 February 2019 в 21:10
поделиться