Каков перевод этой подписи метода Java на простой английский язык?

Я портирую JBox2D на Xojo. Java — это не тот язык, который я хорошо знаю, но он достаточно похож на Xojo, чтобы это был самый простой способ портировать на него Box2D.

Я хорошо разбираюсь в порте, но не могу понять значение сигнатуры этого метода:

  public static <T> T[] reallocateBuffer(Class<T> klass, T[] oldBuffer, int oldCapacity,
      int newCapacity) {}
  1. Возвращает ли этот метод массив любого типа класса?
  2. Означает ли Class<T> klass, что параметр klass может относиться к любому классу?

person Garry Pettet    schedule 03.09.2017    source источник
comment
Руководство по дженерикам Google для Java. Нажмите на первую ссылку.   -  person JB Nizet    schedule 03.09.2017
comment
В этом сценарии T означает любой класс. Вы можете прочитать об Generics.   -  person Jaims    schedule 03.09.2017
comment
Он берет массив типа, указанного Class<T>, и копирует его. Например, вы можете вызвать его с reallocateBuffer(String.class, stringArray, stringArray.length, 10_000) — он вернет новый String[] с длиной 10_000 — предположительно копирование данных из stringArray во вновь выделенный массив.   -  person Boris the Spider    schedule 03.09.2017


Ответы (1)


По сути, эта сигнатура функции позволяет обрабатывать массивы разных типов в одном месте. Если бы он был запрограммирован на C, он, вероятно, использовал бы макрос (#define) для выполнения чего-то подобного.

Синтаксически <T> означает: T является заполнителем для любого класса объектов, переданных этой функции. Если вы передаете этой функции объект типа T, то все остальные места, в которых упоминается T внутри этой функции, также будут означать этот тип. Таким образом, вам не нужно писать отдельные функции, если вы хотите обрабатывать разные типы. Однако внутри компилятор вполне может генерировать отдельный код для каждого типа. Таким образом, дженерики — это ярлык, позволяющий работать с типами переменных.

Это будет сложно перевести на Xojo, так как он не предоставляет для этого никаких средств.

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

Вы можете работать с базовым классом Xojo Object в качестве параметра, хотя передача массивов Object часто не будет работать из-за довольно статической проверки типов массивов Xojo.

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

Что-то вроде этого:

Sub createObjects(arrayContainer as Variant, newAmount as Integer)
  if not arrayContainer.IsArray then break ' assertion

  // Handle case when array is of MyObject1
  try
    #pragma BreakOnExceptions off ' prevents Debugger from stopping here
    dim a() as MyObject1 = arrayContainer
    #pragma BreakOnExceptions default
    for i as Integer = 1 to newAmount
      a.Append new MyObject1
    next
    return
  catch exc as TypeMismatchException
    ' fall thru
  end try

  // Handle more types here
  break
End Sub

Затем назовите это так:

dim d() as MyObject1
createObjects d, 3
person Thomas Tempelmann    schedule 03.09.2017
comment
Идеальный ответ. Спасибо, Томас. Будет ли класс Auto лучшей заменой Object? - person Garry Pettet; 03.09.2017
comment
Нет, auto может только избавить вас от необходимости записывать конкретный тип (имя класса). Это не заполнитель, который позволил бы вам использовать разные типы в одном месте. - person Thomas Tempelmann; 03.09.2017