Почему конструкция TypeToken в Gson настолько странная?

Когда я использую Gson для разбора между объектом и json, инициализация TypeToken настолько странная:

Type collectionType = new TypeToken<Collection<Integer>>(){}.getType();

Я просто знаю такой формат: new TypeToken<Collection<Integer>>().getType();, что для фигурных скобок выше? Спасибо заранее!

PS Я изучил исходный код класса TypeToken, это class (не интерфейс или абстрактный) и без какого-либо конструктора, что означает, что он использует no-parameter constructor как по умолчанию.

P.S.2 Когда я удаляю фигурные скобки, он говорит мне, что конструктор не виден. Когда я смотрел внутри класса TypeToken, это конструктор:

  protected TypeToken() {
        this.type = getSuperclassTypeParameter(getClass());
        this.rawType = (Class<? super T>) $Gson$Types.getRawType(type);
        this.hashCode = type.hashCode();
  }

Почему он просто не использует public?

Ответ 1

'Weird' - не совсем технический термин. Класс определяется таким образом, чтобы заставить вас явно указывать общий параметр, который должен быть связан с конкретным экземпляром его. Поскольку скомпилированные классы Java сохраняют информацию об их общих параметрах, информация затем становится доступной для библиотек фреймворков, которые этого требуют.

Это сама цель токена супер-типа.

Ответ 2

new TypeToken<Collection<Integer>>(){} означает, что вы создаете анонимный внутренний класс, который расширяет TypeToken<Collection<Integer>>. Также в то же время вы создаете экземпляр этого анонимного класса.

Из ссылки:

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

Ответ 3

TypeToken является абстрактным, поэтому вам нужно создать конкретный класс для его создания, поэтому у вас есть {}.

Этот код создает конкретный анонимный подкласс, создавая его экземпляр, затем вызывает getType в экземпляре.