2010-02-26 6 views
4

J'essaie d'utiliser cette méthode mais j'obtiens une erreur dans Eclipse en disant que l'argument type est incorrect et il me dit de changer la signature de la méthode. Une raison pour laquelle?La méthode générique ne fonctionne pas

/**Creates an independent copy(clone) of the T array. 
* @param array The 2D array to be cloned. 
* @return An independent 'deep' structure clone of the array. 
*/ 
public static <T> T[][] clone2DArray(T[][] array) { 
    int rows=array.length ; 

    //clone the 'shallow' structure of array 
    T[][] newArray = array.clone(); 

    //clone the 'deep' structure of array 
    for(int row=0;row<rows;row++){ 
     newArray[row]=array[row].clone(); 
    } 

    return newArray; 
} 
+0

Pouvez-vous nous montrer le code où vous invoquez la méthode? –

+2

dites-nous comment vous l'utilisez .. dans l'état actuel, il n'y a pas d'erreurs –

+1

Utilisez-vous des primitives dans le code appelant? – JRL

Répondre

1

La méthode copy2DArray que vous avez publiée semble fonctionner comme annoncé. Peut-être que vous appelez la méthode de manière incorrecte? Assurez-vous également que vous n'utilisez pas de types primitifs au lieu d'objets dans le tableau que vous copiez. En d'autres termes, utilisez Integer au lieu de int.

Voici un exemple de la méthode de travail:

public class Main { 

    // ... 
    // Your copy2DArray method goes here 
    // ... 

    public static void main(String[] args) { 
     // The array to copy 
     Integer array[][] = { 
      {0, 1, 2}, 
      {3, 4, 5}, 
      {6, 7, 8} 
     }; 

     // Create a copy of the array 
     Integer copy[][] = clone2DArray(array); 

     // Print the copy of the array 
     for (int i = 0; i < copy.length; i++) { 
      for (int j = 0; j < copy[i].length; j++) { 
       System.out.print(copy[i][j] + " "); 
      } 

      System.out.println(); 
     } 
    } 
} 

Ce code imprimera:

0 1 2 
3 4 5 
6 7 8 
+0

Salut, je n'utilise pas les types primatifs et il est encore ne fonctionne pas. J'utilise une interface que j'ai créée appelée Gridable – jax

1

Cela fonctionne avec toutes les classes. Il ne fonctionne pas avec les primitives (int, long, etc.)

Ainsi, au lieu d'utiliser des tableaux primitifs utiliser les classes d'emballage: utiliser Integer[][] au lieu de int[][].

Vous pouvez utiliser commons-lang ArrayUtils.toPrimitive(..) and ArrayUtils.toObject(..) pour convertir des tableaux entre des primitives et leurs wrappers.

+0

C'est parce qu'un type générique doit étendre 'Object' (http://stackoverflow.com/questions/112320/is-static-metaprogramming-possible-in-java) –

0

Vous pouvez utiliser les types primitifs, quand il n'y a pas d'effacement pour les types primitifs. c'est-à-dire, int.class est complètement impossible, mais Integer.class fonctionne. Partout où les génériques sont impliqués, les types primitifs sont un non-go.

Questions connexes