2017-09-03 93 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'只能保存*寫出*特定類型(類名)。它不是一個佔位符,它可以讓你在一個地方使用不同的類型。 –