1

我正在将 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参数可以是任何类?
4

1 回答 1

2

基本上,该函数签名可以在一个地方处理不同类型的数组。如果它是用 C 语言编写的,它可能会使用宏 ( #define) 来完成类似的事情。

从语法上讲,这<T>意味着: T 是 arr 传递给此函数的任何对象类的占位符。如果您将 T 类型的对象传递给此函数,则在此函数中提及 T 的所有其他位置也将表示该类型。这样,如果您想处理不同的类型,就不必编写单独的函数。不过,在内部,编译器很可能会为每种类型生成单独的代码。因此,泛型是一种捷径,让您可以使用变量类型。

这将很难翻译成 Xojo,因为它没有为此提供任何方法。

由于 Xojo 不提供对泛型(模板)的支持,因此您需要找出该函数实际使用了哪些不同的数组类型,并为每种情况编写一个特定的函数。

您可以使用 Xojo 的基类Object作为参数,尽管由于 Xojo 对数组的类型检查相当静态,因此传递 Object 数组通常不起作用。

解决这个问题的一个技巧是将数组打包成一个 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
于 2017-09-03T10:18:41.683 回答