2017-09-03 7 views
1

Je suis en train de porter JBox2D sur Xojo. Java n'est pas un langage que je connais bien, mais il y a assez de similarités avec Xojo pour que ce soit le moyen le plus simple de le porter sur Box2D.Quelle est la traduction de cette signature de méthode Java en anglais?

Je suis bien dans le port mais je ne peux pas comprendre la signification de cette signature de la méthode:

public static <T> T[] reallocateBuffer(Class<T> klass, T[] oldBuffer, int oldCapacity, 
     int newCapacity) {} 
  1. Est-ce que cette méthode renvoie un tableau de tout type de classe?
  2. Est-ce que Class<T> klass signifie que le paramètre klass peut appartenir à une classe quelconque?
+0

Google pour "Java génériques tutoriel". Cliquez sur le premier lien –

+0

Dans ce scénario, 'T' signifie _any_ class. Vous pouvez lire sur [Generics] (https://docs.oracle.com/javase/tutorial/java/generics/types.html). – Jaims

+0

Il prend un tableau d'un type spécifié par 'Class ' et le copie. Par exemple, vous pouvez l'appeler avec 'reallocateBuffer (String.class, stringArray, stringArray.length, 10_000)' - il retournera un nouveau 'String []' avec la longueur '10_000' - copiant sans doute les données de' stringArray' à le tableau nouvellement alloué. –

Répondre

2

Fondamentalement, cette signature de fonction permet de gérer des tableaux de types différents en un seul endroit. S'il était programmé en C, il utiliserait probablement une macro (#define) pour accomplir quelque chose de similaire.

Syntaxiquement, le <T> signifie: T est un espace réservé pour toute classe d'objecs que arr passé à cette fonction. Si vous passez un objet de type T à cette fonction, alors tous les autres endroits qui mentionnent T dans cette fonction signifieront aussi ce type. De cette façon, vous n'avez pas besoin d'écrire des fonctions séparées si vous voulez gérer différents types. En interne, le compilateur peut bien générer du code séparé pour chaque type, cependant. Ainsi, les génériques sont un raccourci, vous permettant de travailler avec des types variables.

Cela sera difficile à traduire en Xojo, car il ne fournit aucun moyen pour cela. Étant donné que Xojo n'offre pas de support pour les génériques (modèles), vous devez rechercher les différents types de tableaux réellement utilisés avec cette fonction et écrire une fonction spécifique pour chacun de ces cas.

Vous pouvez peut-être utiliser la classe de base de Xojo Object comme paramètre, bien que les tableaux de passage d'objet ne fonctionnent souvent pas en raison du contrôle de type plutôt statique de Xojo sur les tableaux.

Une astuce autour de ceci serait d'emballer le tableau dans un Variant, puis de traiter chaque type de tableau à l'intérieur. Ce ne serait pas encore générique mais garderait au moins tout dans une seule fonction, comme le fait l'original.

Quelque chose comme ceci:

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 

Alors appelez comme ceci:

dim d() as MyObject1 
createObjects d, 3 
+0

Réponse parfaite. Merci Thomas. La classe 'Auto' serait-elle un meilleur substitut à' Object'? – Garry

+0

Non, 'auto' peut seulement vous sauver de * écrire * le type spécifique (nom de la classe). Ce n'est pas un espace réservé qui vous permettrait d'utiliser différents types en un seul endroit. –