2010-11-22 25 views
4

Je suis en train de suivre un cours sur les structures de données, et nous utilisons les structures de données et l'analyse algorithmique dans Java 2nd Edition de Mark Weiss. Dans son implémentation BinaryHeap, son constructeur crée un tableau Comparable [] qui est casté en AnyType []. Avez-vous une idée de la raison pour laquelle il fait cela au lieu de simplement créer un nouveau AnyType []? Je comprends la structure du BinaryHeap, mais je veux être à jour sur les génériques. La déclaration de classe est assez simple, assurez-vous que AnyType étend un type comparable à AnyType ou tout superclasse hiérarchie d'héritage de AnyType (dans le cas où AnyType est une sous-classe d'un type et n'a pas besoin de changer sa méthode compareTo pour fonctionner).Structures de données (livre Weiss Java): Pourquoi allouer Comparable [] dans le tableau BinaryHeap <T> au lieu de T []?

Cependant, la ligne, array = (AnyType[]) new Comparable[ capacity + 1 ];, n'a aucun sens pour moi. AnyType n'est-il pas déjà comparable? Quelles sont les ramifications pour écrire simplement array = new AnyType[ capacity + 1 ];?

La source complète de classe se trouvent on his site, mais voici les parties qui me préoccupent:

public class BinaryHeap<AnyType extends Comparable<? super AnyType>> 
{ 
    private int currentSize;  // Number of elements in heap 
    private AnyType [ ] array; // The heap array 

    /** 
    * Construct the binary heap. 
    * @param capacity the capacity of the binary heap. 
    */ 
    public BinaryHeap(int capacity) 
    { 
     currentSize = 0; 
     array = (AnyType[]) new Comparable[ capacity + 1 ]; 
    } 

Répondre

4

Vous ne pouvez pas créer de tableaux d'un type générique car les informations de type n'existent pas au moment de l'exécution. Comme AnyType s'étend Comparable, c'est le seul type de «béton» qui peut être utilisé.

La conversion en AnyType[] consiste simplement à s'assurer que des avertissements de compilation sont donnés en cas d'erreur; ce cast n'existera pas dans les instructions de bytecode résultantes. De même, la variable de classe array sera un Comparable[] dans le bytecode résultant.

2

Java utilise Type Erasure pour mettre en œuvre Generics donc au moment de l'exécution ne sait pas le AnyType type et par conséquent vous ne pouvez pas en créer un tableau. Regardez cet autre question.

1

En raison de l'effacement de type générique, le compilateur n'a aucune idée de ce qu'est AnyType (et ne peut donc pas en créer un tableau). Mais nous savons que AnyType implémente Comparable, donc créer un tableau de Comparables est une solution sûre.