La création d'un nouveau générique de type tableau à l'aide du Tableau.newInstance()

Pour la pratique, je suis en train de mettre en œuvre la fusion algorithme de tri mais il est resté coincé assez vite lorsque l'on essaie d'instancier un type générique de la matrice. Je ne suis pas entièrement sûr si mon plan de travail, mais pour l'instant, la partie la plus intéressante (ou frustrant, selon le moment où vous me demandez) est la deuxième ligne de la méthode merge (). La méthode newInstance() a besoin de savoir dans quelle classe il doit initier, mais même si arr1.getClass() compile parfaitement bien, il ne fonctionne pas lors de l'exécution.

public void mergeSort(T[] arr) {

    T[] merged = merge(Arrays.copyOfRange(arr, 0, arr.length/2), Arrays.copyOfRange(arr, arr.length/2+1, arr.length-1));

}

@SuppressWarnings({"unchecked"})
public T[] merge(T[] arr1, T[] arr2) {
    //A new array of type T that will contain a merged version of arr1 and arr2
    T[] merged = (T[]) Array.newInstance(arr1.getClass(), arr1.length+arr2.length);

    int i1 = 0, i2 = 0;
    for (int i = 0; i < arr1.length + arr2.length; i++) {
        if (arr1[i1].compareTo(arr2[i2]) < 0) {
            merged[i] = arr1[i1];
            i1++;
        } else {
            merged[i] = arr2[i2];
            i2++;
        }
    }

    return merged;
}

Le message d'erreur est:

Exception in thread "main" java.lang.ClassCastException: [[Ljava.lang.String; cannot be cast to [Ljava.lang.Comparable;
    at sort.SortingAndSearching.merge(SortingAndSearching.java:94)
    at sort.SortingAndSearching.mergeSort(SortingAndSearching.java:84)
    at sort.SortingAndSearching.main(SortingAndSearching.java:19)

OriginalL'auteur Jimmy C | 2012-10-08