Stringe warning Comparable

di il
11 risposte

Stringe warning Comparable

Salve,negli esercizi di programmazione con l'utilizzo di Comparable,in compilazione mi vengono date le due classiche stringe di segnalazione warning.
Tuttavia,con l'iscrizione javac -nowarn (nomeClasse).java non riesco ad ignorarle.
Ho provato anche diverse varianti come -Xlint:none ma ancora niente. Qualcuno sa aiutarmi? Programmo da un MacBook Pro.

11 Risposte

  • Re: Stringe warning Comparable

    Edoardo ha scritto:


    Salve,negli esercizi di programmazione con l'utilizzo di Comparable,in compilazione mi vengono date le due classiche stringe di segnalazione warning.
    Ma hai usato i generics (cioè hai parametrizzato Comparable) oppure no?
    A meno che usi vecchi JDK pre-Java 5, i generics dovresti usarli.
  • Re: Stringe warning Comparable

    Allora credo di non aver capito bene l'argomento..
    Se la classe che mi danno non dice esplicitamente che implementa Comparable,devo scrivermi io un'interfaccia e scrivere il metodo compareTo?
    Ti dico così perchè negli esami svolti dal mio professore lui non aveva implementato Comparable se la classe non lo diceva esplicitamente (in altre si),ma compilando questi,pure a lui dava gli stessi messaggi di warning
  • Re: Stringe warning Comparable

    Edoardo ha scritto:


    Allora credo di non aver capito bene l'argomento..
    Se la classe che mi danno non dice esplicitamente che implementa Comparable,devo scrivermi io un'interfaccia e scrivere il metodo compareTo?
    Implementare il Comparable (quello del framework, non un "tuo" Comparable) in una classe es. Persona, Libro ecc serve principalmente per far sì che oggetti di queste tue classi siano confrontabili tra di loro sfruttando i metodi del framework (es. i sort di liste/array) o le collezioni "sorted" del framework (es. TreeSet).

    Il punto è che da Java 5 Comparable è diventata "generica" e quindi sarebbe bene sfruttare i generics
  • Re: Stringe warning Comparable

    Ok l'ho appena fatto.. Mi da ancora in compilazione:
    Q.java uses unchecked or unsafe operations
    Recomoile with -Xlint:unchecked for details.
    Il nostro professore ci ha sempre detto di ignorare queste segnalazioni con javac -nowarn Q.java..
    Solo che a questo punto mi ritornano quelle due stringhe.. Conosci altri comandi per caso per ignorarle?
  • Re: Stringe warning Comparable

    Edoardo ha scritto:


    Ok l'ho appena fatto..
    Hai fatto cosa esattamente? Se usi i generics in modo consistente e corretto, non hai più alcun warning (riguardo i tipi generici).

    Edoardo ha scritto:


    Mi da ancora in compilazione:
    Q.java uses unchecked or unsafe operations
    Recomoile with -Xlint:unchecked for details.
    Il compilatore ti dice anche cosa specificare per ottenere più informazioni a riguardo.
    Comunque i warning di questo tipo li puoi sopprimere con una opzione o con una annotazione nel sorgente.

    Magari mostra il codice ...
  • Re: Stringe warning Comparable

    Public class Q implements CQueue,Comparable<Q>
    {
    private static final int INITIAL_DIM = 1;

    private Comparable[] v;
    private int front;
    private int back;

    /**
    Inizializza una coda vuota
    */
    public Q()
    { v = new Comparable[INITIAL_DIM];
    front = back = 0;
    }

    /**
    @return numero di elementi nel contenitore
    */
    public int size()
    { return (back - front + v.length) % v.length;
    }

    /**
    @return true se il contenitore e' vuoto, false altrimenti
    */
    public boolean isEmpty()
    { return front == back;
    }

    /**
    accoda un elemento
    Complessita' temporale: O(1) con analisi ammortizzata
    @param x elemento da accodare
    */
    public void enqueue(Comparable x)
    { if (increment(back) == front)
    { Comparable[] a = new Comparable[2 * v.length];
    System.arraycopy(v, front, a, 0, v.length - front);
    System.arraycopy(v, 0, a, v.length - front, back);
    front = 0;
    back = size();
    v = a;
    }

    v[back] = x;
    back = increment(back);
    }

    /**
    ispezione, estraendolo, l'elemento in fronte alla coda
    Complessita' temporale: O(1)
    @return elemento in fronte alla coda
    @throw EmptyQueueException se la coda e' vuota
    */
    public Object dequeue() throws EmptyQueueException
    {
    Object x = v[front];
    v[front] = null;
    front = increment(front);
    return x;
    }

    /**
    restituisce la descrizione testuale della coda, un elemento per riga, in
    sequenza FIFO, in modo che il primo elemento sia l'elemento in testa alla
    coda
    Complessita' temporale: O(n)
    @return descrizione testuale
    */
    public String toString()
    { Comparable[] a = toArray();

    String str = "";
    for (int i = 0; i < a.length; i++)
    str = str + a + "\n";

    return str;
    }

    /**
    restituisce gli elementi comparabili della coda in un array ordinato in
    senso crescente, secondo il loro ordine naturale
    Complessita' temporale: O(n logn)
    @return array ordinato contenente gli elementi comoparabili della coda
    */
    public Comparable[] toSortedArray()
    { Comparable[] a = toArray();
    mergesort(a);
    return a;
    }

    /*
    incremento di indice circolare
    */
    private int increment(int k)
    { return (k + 1) % v.length;
    }

    /*
    restituisce in un array gli elementi comparabili della coda in sequenza
    FIFO, in modo che all'indice zero ci sia il fronte della coda
    */
    private Comparable[] toArray()
    { Comparable[] a = new Comparable[size()];

    int i = 0;
    int j = front;
    while (i < a.length)
    { a = v[j];
    i++;
    j = increment(j);
    }

    return a;
    }

    public int compareTo(Q obj)
    {if(size()<obj.size()) return -1;
    if(size()>obj.size()) return 1;
    return 0;}

    /*
    ordinamento per fusione
    */
    private static void mergesort(Comparable[] a)
    { if (a.length < 2)
    return;

    int mid = a.length / 2;
    Comparable[] left = new Comparable[mid];
    Comparable[] right = new Comparable[a.length - mid];

    System.arraycopy(a, 0, left, 0, mid);
    System.arraycopy(a, mid, right, 0, a.length - mid);

    mergesort(left);
    mergesort(right);

    merge(a, left, right);
    }

    /*
    fusione
    */
    private static void merge(Comparable[] a, Comparable[] b, Comparable[] c)
    { int ia = 0, ib = 0, ic = 0;

    while (ib < b.length && ic < c.length)
    if (b[ib].compareTo(c[ic]) < 0)
    a[ia++] = b[ib++];
    else
    a[ia++] = c[ic++];

    while (ib < b.length)
    a[ia++] = b[ib++];

    while (ic < c.length)
    a[ia++] = c[ic++];
    }
    }
    interface CQueue
    {
    /**
    @return true se il contenitore e' vuoto, false altrimenti
    */
    boolean isEmpty();

    /**
    @return numero di elementi nel contenitore
    */
    int size();

    /**
    accoda un elemento
    @param x elemento da accodare
    */
    void enqueue(Comparable x);

    /**
    ispezione, estraendolo, l'elemento in fronte alla coda
    estae un elemento
    @return elemento in fronte alla coda
    @throw EmptyQueueException se la coda e' vuota
    */
    Object dequeue() throws EmptyQueueException;
    }
  • Re: Stringe warning Comparable

    Edoardo ha scritto:


    public class Q implements CQueue,Comparable<Q>
    Ok ora è più chiaro: stai creando una nuova collezione che da quanto deduco è una "coda".
    Se così, quel Comparable<Q> ha relativamente poco senso perché descriverebbe solo che due code sono confrontabili tra di loro (non che gli elementi contenuti sono comparabili!). Il che ha un senso molto (poco) relativo.

    Indubbiamente, e senza offesa, mancano "basi" sui generics.
  • Re: Stringe warning Comparable

    Si lo so perchè non ce le hanno mai date queste basi! Ci han semplicemente detto che per creare comunque il file in bytecode basta usare -nowarn.. Tu conosci un altro modo per caso?
  • Re: Stringe warning Comparable

    Edoardo ha scritto:


    Tu conosci un altro modo per caso?
    Scusa, rispondo solo ora. Sì un modo è annotare la classe Q con @SuppressWarnings
    @SuppressWarnings("unchecked")
    public class Q implements  ............
  • Re: Stringe warning Comparable

    Grazie mille!
  • Re: Stringe warning Comparable

    Comunque, a prescindere dalla ragionevolezza del codice (che come dice andbin non ha molto senso), quel warning credo sia dovuto al fatto che nel codice crei dei vettori di Comparable senza specificarne il tipo. Dovresti fare tipo:
    Comparable<Q>[] CompArray=new Comparable<>[n];
Devi accedere o registrarti per scrivere nel forum
11 risposte