2017-09-03 72 views
1

我将JBox2D移植到Xojo。 Java并不是我熟悉的语言,但与Xojo有足够的相似之处,因为这是将Box2D移植到它的最简单方法。这种Java方法签名在普通英语中的翻译是什么?

我顺利进入港口,但我不能完全理解这种方法签名的含义:

public static <T> T[] reallocateBuffer(Class<T> klass, T[] oldBuffer, int oldCapacity, 
     int newCapacity) {} 
  1. 请问这个方法返回任何类类型的数组?
  2. 是否Class<T> klass意味着klass参数可以是任何类的?
+0

谷歌为 “Java泛型教程”。点击第一个链接。 –

+0

在这种情况下,'T'表示_any_类。你可以阅读[泛型](https://docs.oracle.com/javase/tutorial/java/generics/types.html)。 – Jaims

+0

它需要一个'Class '指定的类型的数组并将其复制。例如,你可以用'reallocateBuffer(String.class,stringArray,stringArray.length,10_000)'调用它 - 它会返回一个新的'String []'长度为10_000' - 可能是将数据从'stringArray'复制到新分配的数组。 –

回答

2

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

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

这将很难转化为Xojo,因为它没有提供任何手段。

由于Xojo不提供泛型(模板)的支持,你需要找出哪些不同数组类型实际上与此功能使用,并写出每种情况的特定功能。

虽然由于Xojo对数组的静态类型检查,传递Object的数组通常不起作用,您或许可以使用Xojo的基类Object作为参数。

解决此特技将所述阵列包成一个变量,然后专用手柄每个阵列型的内部。这仍然不是通用的,但至少将其全部保存在一个函数中,就像原来的一样。

事情是这样的:

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 
+0

完美答案。谢谢托马斯。 'Auto'类是'Object'的更好替代品吗? – Garry

+0

不,''auto'只能保存*写出*特定类型(类名)。它不是一个占位符,它可以让你在一个地方使用不同的类型。 –