我正在将JBox2D移植到Xojo。 Java不是我所熟知的语言,但是与Xojo有足够的相似性,这是将Box2D移植到它的最简单方法。

我很熟悉端口,但是我无法理解此方法签名的含义:

  public static <T> T[] reallocateBuffer(Class<T> klass, T[] oldBuffer, int oldCapacity,
      int newCapacity) {}



此方法是否返回任何类类型的数组?
Class<T> klass表示klass参数可以是任何类吗?

最佳答案

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

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

这将很难翻译成Xojo,因为它没有提供任何手段。

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

尽管由于Xojo对数组的静态类型检查,传递对象的数组通常不起作用,但您也许可以使用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

08-17 11:31