Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    warning: [unchecked] unchecked cast

    ciao a tutti, vi volevo chiedere un aiuto con questa classe generica:

    codice:
    public class Coppia<T>{
    
    	private T primo;
    	private T secondo;
    	
    	public Coppia() {
    		primo=null;
    		secondo=null;
    	}
    	
    	public Coppia(T primo, T secondo) {
    		this.primo=primo;
    		this.secondo=secondo;
    	}
    
    	public void setPrimo(T primo) {
    		this.primo=primo;
    	}
    
    	public T getPrimo() {
    		return primo;
    	}
    
    	public void setSecondo(T secondo) {
    		this.secondo=secondo;
    	}
    
    	public T getSecondo() {
    		return secondo;
    	}
    
    	public String toString() {
    		return "("+primo+","+secondo+")";
    	}
    
    	public boolean equals(Object o) {
    		if (o!=null && getClass()==o.getClass()) {
    			Coppia<T> unaCoppia = (Coppia<T>)o;
    			return primo.equals(unaCoppia.primo) && secondo.equals(unaCoppia.secondo);
    		}
    		else
    			return false;
    	}
    	
    }
    il problema è che quando lo compilo con il prompt dei comandi mi da questo errore:

    codice:
    c:\Users\Netbook\Documents\Programmazione\Esempi\Generics>javac -Xlint Coppia.java
    Coppia.java:38: warning: [unchecked] unchecked cast
                            Coppia<T> unaCoppia = (Coppia<T>)o;
                                                             ^
      required: Coppia<T>
      found:    Object
      where T is a type-variable:
        T extends Object declared in class Coppia
    1 warning
    come devo fare per eludere questo problema?!?
    Grazie in anticipo!

  2. #2
    su un altro forum ho trovato questo espediente:

    codice:
    public boolean equals(Object o) {
    		if (o!=null && getClass()==o.getClass()) {
    			@SuppressWarnings("unchecked")
    			Coppia<T> unaCoppia = (Coppia<T>)o;
    			return primo.equals(unaCoppia.primo) && secondo.equals(unaCoppia.secondo);
    		}
    		else
    			return false;
    	}
    ovvero di mettere "@SuppressWarnings("unchecked")" prima della riga del warning. mi compila il tutto e lo esegue in modo corretto. ma il procedimento è giusto?

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Potresti usare le wildcard, così da non generare avvertimenti in fase di compilazione:

    codice:
    Coppia<?> toCompare = (Coppia<?>) o;
    Ovviamente solo dopo essersi assicurati che o sia effettivamente di tipo Coppia.

    Il risultato mi sembra lo stesso del tuo codice, ma se è possibile evitare avvertimenti da parte del compilatore ed annotazioni per "zittirlo" mi sembra meglio.

    Inoltre il tuo metodo solleva una NullPointerException nel caso in cui i tuoi campi siano nulli... visto che tu permetti che siano null, sarebbe meglio considerare questa evenienza all'interno del tuo metodo equals invece di sollevare la suddetta eccezione.

    P.S.: quando fai l'override di un metodo sarebbe buona norma annotarlo con l'apposita annotazione @Override.

  4. #4
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Racchiudi il downcasting in un blocco try-catch in cui catturi una ClassCastException.
    Il motivo di questo warning è che il downcasting potrebbe fallire: non è detto che un riferimento di tipo Object contenga un oggetto di tipo Coppia<T>:

    codice:
    public boolean equals(Object o) 
    {
    		if (o!=null && getClass()==o.getClass()) 
                    {
                            try
                            {
    			    Coppia<T> unaCoppia = (Coppia<T> )o;
    			    return primo.equals(unaCoppia.primo) && secondo.equals(unaCoppia.secondo);
                            }
                            catch(ClassCastException e)
                            {
                                 <stampi un messaggio di errore>
                            }
    		}
    		else
    			return false;
    	}

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    io aggiungo solo che bisogna leggere ma non allarmarsi e che la soluzione "suppress warnings" è una non soluzione (almeno dal mio punto di vista).

    Spirito critico:
    quando viene fuori il warning? Come dice Who am I quando una operazione potrebbe fallire, il compilatore ti segnala un probabile errore a runtime.
    Devo preoccuparmi? dipende, alcune volte possiamo dire al compilatore "sei pedante, non mi interessa" e ignorare il suo warning. Altre volte l'aver ignorato il warning ci potrà portare errori.
    Meglio non mettere l'annotazione @suppress e lasciare la pedanteria, ci potrebbe tornare utile quando non si capisce che errore ci sia in esecuzione. Il consiglio di Who am I resta il migliore (per la mia esperienza)
    RTFM Read That F*** Manual!!!

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Originariamente inviato da Who am I
    Racchiudi il downcasting in un blocco try-catch in cui catturi una ClassCastException.
    Il motivo di questo warning è che il downcasting potrebbe fallire: non è detto che un riferimento di tipo Object contenga un oggetto di tipo Coppia<T>:

    codice:
    public boolean equals(Object o) 
    {
    		if (o!=null && getClass()==o.getClass()) 
                    {
                            try
                            {
    			    Coppia<T> unaCoppia = (Coppia<T> )o;
    			    return primo.equals(unaCoppia.primo) && secondo.equals(unaCoppia.secondo);
                            }
                            catch(ClassCastException e)
                            {
                                 <stampi un messaggio di errore>
                            }
    		}
    		else
    			return false;
    	}
    Non ho capito questo codice, in quali condizioni può lanciare quell'eccezione?
    Se entra nell'if l'oggetto è un'istanza della classe Coppia (per la condizione dell'if) e il casting andrà sempre a buon fine, perché il tipo parametrizzato non conterà ed un oggetto Coppia<A> verrà comunque castato ad un oggetto Coppia[B]... e anche quel codice genera lo stesso warning, a questo punto tanto vale utilizzare le wildcard.

    Il cast a Coppia<T> non ha senso perché quel T non viene considerato, per esempio con queste istruzioni:

    codice:
    Coppia<Integer> a = new Coppia<>(1, 2);
    Coppia<String> b = new Coppia<>("a", "b");
    a.equals(b);
    l'eccezione non viene lanciata.

    Sbaglio?

    Se si volesse considerare il tipo parametrizzato bisognerebbe invocare getClass sui campi della classe dichiarati col tipo parametrizzato... ma anche se si può fare, non sempre potrebbe essere la soluzione giusta: avrebbe senso considerare diversi due oggetti della classe Coppia (entrambi contenenti due Integer con gli stessi valori) solo perché in una coppia sono dichiarati Object e nell'altra Integer? Dipende... nelle Collection ad esempio non viene fatto.

  7. #7
    Originariamente inviato da Who am I
    Racchiudi il downcasting in un blocco try-catch in cui catturi una ClassCastException.
    Il motivo di questo warning è che il downcasting potrebbe fallire: non è detto che un riferimento di tipo Object contenga un oggetto di tipo Coppia<T>:

    codice:
    public boolean equals(Object o) 
    {
    		if (o!=null && getClass()==o.getClass()) 
                    {
                            try
                            {
    			    Coppia<T> unaCoppia = (Coppia<T> )o;
    			    return primo.equals(unaCoppia.primo) && secondo.equals(unaCoppia.secondo);
                            }
                            catch(ClassCastException e)
                            {
                                 <stampi un messaggio di errore>
                            }
    		}
    		else
    			return false;
    	}
    ho provato a fare come dice Who am I ma purtroppo mi da lo stesso errore..

    codice:
    c:\Users\Netbook\Documents\Programmazione\Esempi\Generics>javac -Xlint Coppia.java
    Coppia.java:39: warning: [unchecked] unchecked cast
                                    Coppia<T> unaCoppia = (Coppia<T> )o;
                                                                      ^
      required: Coppia<T>
      found:    Object
      where T is a type-variable:
        T extends Object declared in class Coppia
    Coppia.java:48: error: missing return statement
            }
            ^
    1 error
    1 warning
    questo è cioè che mi da il compilatore..

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    mica lui ti ha dato tutto il codice!!
    E poi leggi cosa dice il compilatore, hai un metodo che ritorna qualcosa diverso da voi e non fai tornare nulla!!!
    Con gli if o metti un return dentro ogni ramo oppure fai una cosa simile
    Codice PHP:
    public boolean equals(Object obj){
        
    boolean ret false

       if (
    condizione) {
          
    // fai le tue cose 
             
    ret overoofalse;
       }else{
          
    // fai le tue cose 
             
    ret overoofalse;
       }

    return 
    ret

    RTFM Read That F*** Manual!!!

  9. #9
    l'errore l'ho risolto..il problema rimane il warning "warning: [unchecked] unchecked cast"..non so come posso evitarlo..XD

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ma scusa che fastidio ti dà?
    RTFM Read That F*** Manual!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.