这个Java方法签名用简单的英文翻译成了什么?

时间:2017-09-03 09:37:25

标签: java box2d jbox2d xojo

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

1 个答案:

答案 0 :(得分:2)

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

从语法上讲,<T>表示:T是传递给此函数的任何类对象的占位符。如果将类型为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