Problema METODO "INVISIBILE"

di il
14 risposte

Problema METODO "INVISIBILE"

Ciao a tutti...ho un problema con un pezzo di codice:

allora nel mio programma ho un interfaccia con un metodo GLB(E t), che tra gli elementi di una collezione generica, restituisce l'elemento (se c'è) maggiore, con la condizione che sia minore o uguale a t.

Quando vado ad implementare il metodo nella mia classe tutto ok...il problema è quando, per implementare nella classe un altro metodo, chiamo glb, eclipse mi da errore dicendo:

"The method glb is undefined for the type Vector<E>"

Mi viene inoltre suggerito di effettuare un cast del tipo:

(NomeInterfaccia vet).glb(t) e così funziona.

Non capisco la necessità di mettere il cast...i metodi dell'interfaccia non dovrebbero funzionare su qualunque classe che implementi l'interfaccia, indipendentemente dalla struttura di rappresentazione che uso?

Grazie in anticipo a tutti

14 Risposte

  • Re: Problema METODO "INVISIBILE"

    riccac ha scritto:


    Non capisco la necessità di mettere il cast...i metodi dell'interfaccia non dovrebbero funzionare su qualunque classe che implementi l'interfaccia, indipendentemente dalla struttura di rappresentazione che uso?
    Mostra del codice .... almeno un pezzo della interfaccia e della classe implementante. Altrimenti è poco chiaro.
  • Re: Problema METODO "INVISIBILE"

    public interface ElasticSet<E> {
    	
    	//OVERVIEW
    	//ElasticSet<E> è una collezione modificabile di oggetti omogenei generici 
    	//in cui non sono presenti duplicati.
    	//Un tipico elemento è { el0; el1; el2; .... ; eln }
    	
    	
    	public E glb(E e) throws IllegalArgumentException, NullPointerException;
    	//EFFECTS:
    	//Restituisce l'elemento più grande appartenente alla collezione, con il 
    	//vincolo di essere minore o uguale al parametro del metodo, e.
    	//Se l'elemento cercato non esiste il metodo ritorna null.
    	//Un'eccezione IllegalArgumentException viene lanciata se il parametro e 
    	//è uguale a null, e una NullPointerException nel caso in cui la collezione
    	//sia uguale a null.
    
            .......
    
          }
    
    
    public class ElasticSetClass<E extends Comparable> implements ElasticSet<E>{
    	
    	//RAPPRESENTAZIONE
    	private int dim;
    	private Vector<E> vet;
    	
    	
    	//METODO COSTRUTTORE
    	public ElasticSetClass(){
    		
    		vet=new Vector<E>();
    		dim=0;
    		
    	}
    
           ........
    
           public List<E> view(E f, E t) throws IllegalArgumentException, NullPointerException {
    		
    		//EFFECTS:
    		//Restituisce una vista degli elementi della collezione che sono maggiori
    		//o uguali al parametro f, e minori o uguali al parametro t.
    		//Restituisce null nel caso in cui la vista sia vuota, cioè nel caso che 
    		//nella collezione non siano presenti elementi che soddisfano la proprietà.
    		//Un'eccezione IllegalArgumentException viene lanciata se il parametro f
    		//è strettamente maggiore del parametro t, o se uno dei due parametri 
    		//risulta essere uguale a null.
    		//Può essere anche lanciata un'eccezione NullPointerException nel caso in 
    		//cui la collezione sia uguale a null.
    		
    		if( (f.compareTo(t)>0) || (f==null) || (t==null) ) throw new IllegalArgumentException("view");
    		if(vet==null) throw new NullPointerException("view");
    		
    		E max=((ElasticSet<E>) vet).glb(t);
    		E min=((ElasticSet<E>) vet).lub(f);
    		
    		if(max==null || min==null) return null;
    		
    		List<E> ls=new ArrayList<E>();
    		
    		for(int i=0; i<dim; i++){
    			
    			if(vet.get(i).compareTo(min)>=0 && vet.get(i).compareTo(max)<=0)
    				ls.add(vet.get(i));
    			
    		}
    
              .......
    		
    	}
    
    ......
    
    
    }
    
    Dunque il problema sta nella seguente parte di codice...se io non metto il cast a ElasticSet<E> Eclipse mi da errore dicendo che il metodo glb non è definito sui vector<E>:
           E max=((ElasticSet<E>) vet).glb(t);
    		E min=((ElasticSet<E>) vet).lub(f);
    
  • Re: Problema METODO "INVISIBILE"

    riccac ha scritto:


    Dunque il problema sta nella seguente parte di codice...se io non metto il cast a ElasticSet<E> Eclipse mi da errore dicendo che il metodo glb non è definito sui vector<E>:
    La tua classe ElasticSetClass implementa ElasticSet, quindi è la tua classe che dovrà avere il metodo glb.

    Ma tu glb stai cercando di invocarlo sul Vector!!! Il cast è lecito per il compilatore. Sebbene Vector sappiamo non implementa ElasticSet, una sottoclasse "potrebbe" implementarla (dato che Vector non è final). Quindi per il compilatore il cast è teoricamente possibile.

    Ma il tuo codice FALLIRÀ miseramente a runtime, perché l'oggetto realmente istanziato e assegnato a vet è un java.util.Vector ed esso NON implementa ovviamente come ben sappiamo ElasticSet.

    Il glb lo devi per forza avere nella tua classe ... quindi perché ti ostini a tentare di invocarlo su un Vector?
  • Re: Problema METODO "INVISIBILE"

    Lo invoco sul vector perchè nel metodo in cui lo chiamo devo restituire una lista che abbia, tra le varie proprietà, la presenza del glb...quindi, ricerco il glb nel vector.

    Scusa ma non capisco dove è l'errore concettuale che non capisco...
  • Re: Problema METODO "INVISIBILE"

    riccac ha scritto:


    Lo invoco sul vector perchè nel metodo in cui lo chiamo devo restituire una lista che abbia, tra le varie proprietà, la presenza del glb...quindi, ricerco il glb nel vector.

    Scusa ma non capisco dove è l'errore concettuale che non capisco...
    import java.util.*;
    
    public class Prova {
        public static void main(String[] args) {
            Vector<String> v = new Vector<String>();
            v.add("aaa");
            
            String s = ((Queue<String>) v).poll();
        }
    }
    Queue è java.util.Queue, una interfaccia.

    Il cast è lecito per il compilatore, perché l'oggetto referenziato da v "potrebbe" implementare Queue.

    Infatti nessuno mi vieterebbe di fare una classe:

    public class MyVectorQueue<T> extends Vector<T> implements Queue<T> {
    ......
    }

    e poi in Prova fare:

    Vector<String> v = new MyVectorQueue<String>();

    Ma nel codice iniziale ho istanziato java.util.Vector ed esso NON implementa Queue, quindi il cast fallirà sempre a runtime:

    Exception in thread "main" java.lang.ClassCastException: java.util.Vector cannot be cast to java.util.Queue
  • Re: Problema METODO "INVISIBILE"

    Andbin ma quindi lo sbaglio che faccio io è il cast (suggeritomi da eclipse) o cosa?
    Non riesco a capire cosa sto sbagliando...ho capito che i vector non "supportano" per forza i miei metodi...ma quindi come potrei risolvere il problema?
    Scusa ma non sto capendo molto l'errore che sto commettendo
  • Re: Problema METODO "INVISIBILE"

    riccac ha scritto:


    Andbin ma quindi lo sbaglio che faccio io è il cast (suggeritomi da eclipse) o cosa?
    Hai istanziato un Vector, ed esso NON implementa (ovviamente) la tua interfaccia ElasticSet.

    Ma la tua classe ElasticSetClass implementa ElasticSet, quindi all'interno della tua classe devi per forza implementare il metodo glb.

    Pertanto (secondo i concetti che stai gestendo ... che non riesco io ovviamente a comprendere subito ora) perché non puoi invocare glb sul this (in sostanza la istanza) della TUA classe??
  • Re: Problema METODO "INVISIBILE"

    Ok ora ho capito andbin....non so se sto per tirare una bestemmia informatica ma scusa
    Nella mia classe il costruttore
    public class ElasticSetClass<E extends Comparable> implements ElasticSet<E>{
    	
    	//RAPPRESENTAZIONE
    	private int dim;
    	private Vector<E> vet;
    	
    	
    	//METODO COSTRUTTORE
    	public ElasticSetClass(){
    		
    		vet=new Vector<E>();
    		dim=0;
    		
    	}
    
            .......
    
     }
    inizializza il vector vet.

    Quindi non è uguale dire this.vet.metodo() a vet.metodo() ?

    E inoltre se io eseguo lo stesso metodo (glb) nel main va perfettamente, cosa che non mi spiego.
  • Re: Problema METODO "INVISIBILE"

    riccac ha scritto:


    E inoltre se io eseguo lo stesso metodo (glb) nel main va perfettamente, cosa che non mi spiego.
    Continuo a ripeterti che è la TUA classe ElasticSetClass che ha il metodo glb (e lo ha perché implements ElasticSet e quindi lo DEVI implementare tu).

    Ma il java.util.Vector ovviamente NON implementa ElasticSet e quindi non può certo avere il glb!
  • Re: Problema METODO "INVISIBILE"

    Ma io l'ho implementato glb...pensavo che l'avessi capito andbin...nel caso contrario scusami se mi sono spiegato male.

    E' per questo che non capivi cosa mi stavi dicendo....comunque, avendo io implementato glb, nella mia classe, è comunque necessario "castare" VET, facendo
    E max=((ElasticSet<E>) vet).glb(t);
    o è ancora sbagliato?
  • Re: Problema METODO "INVISIBILE"

    riccac ha scritto:


    è comunque necessario "castare" VET, facendo
    E max=((ElasticSet<E>) vet).glb(t);
    o è ancora sbagliato?
    Sì, è SBAGLIATO, perché non ti funzionerà mai a runtime.

    Ora provo a dirti una cosa in altro modo: nella tua implementazione di

    public List<E> view(E f, E t)

    ha senso (per il concetto che devi gestire) USARE (=invocare) il glb che tu stesso hai implementato nella tua classe?

    Se sì, invocalo e basta.
  • Re: Problema METODO "INVISIBILE"

    C'e' anche un'altra scicochezza concettuale, almeno leggendo la documentazione:

    //EFFECTS:
    //Restituisce una vista degli elementi della collezione che sono maggiori
    //o uguali al parametro f, e minori o uguali al parametro t.
    //Restituisce null nel caso in cui la vista sia vuota, cioè nel caso che
    //nella collezione non siano presenti elementi che soddisfano la proprietà.
    //Un'eccezione IllegalArgumentException viene lanciata se il parametro f
    //è strettamente maggiore del parametro t, o se uno dei due parametri
    //risulta essere uguale a null.
    //Può essere anche lanciata un'eccezione NullPointerException nel caso in
    //cui la collezione sia uguale a null


    Perche' deve restituire NULL se la vista e' vuota?
    Che' differenza c'e' tra

    1) una vista piena in cui non ci sono elementi che soddisfano la condizione E
    2) una vista vuota in cui, OVVIAMENTE, non ci sono elementi che soddisfano la condizione]/i] ????

    Questo e' un classico esempio di incomprensione che c'e' tra null e una collezione vuota!
  • Re: Problema METODO "INVISIBILE"

    @ANDBIN
    andbin, allora nell'implementazione di view non è strettamente necessario usare il glb, potrei farne benissimo a meno e sostituirlo con un ciclo for, però ormai mi aveva incuriosito questo problema e volevo farlo con quel metodo per capire una volta per tutte come funziona questa faccenda!

    Però a me va a runtime..se vuoi ti posto il codice:
    public class Test1 {
    	
    	public static void main(String[] args){
    		
    		ElasticSetClass<Integer> v;
    		v=new ElasticSetClass<Integer>();
    		
    		System.out.println(v.isEmpty());
    		System.out.println(v.size());
    		v.add(6);
    		v.add(7);
    		v.add(5);
    		v.add(13);
    		v.add(9);
    		v.add(10);
    		Integer x=v.glb(8);
    		Integer y=v.lub(8);
    		System.out.println(x);
    		System.out.println(y);
    		
    		System.out.println(v.view(6, 9));
    
    		}
    
    }
    
    con questa classe di test mi gira correttamente e mi da gli output giusti...


    @MIGLIORABILE
    Migliorabile, hai ragione, mi era sfuggita questa cosa!
  • Re: Problema METODO "INVISIBILE"

    riccac ha scritto:


    Però a me va a runtime..se vuoi ti posto il codice:

    con questa classe di test mi gira correttamente e mi da gli output giusti...
    Se ti riferisci al fatto che glb lo invoca ok .... ovvio: v è un ElasticSetClass e quindi HA il metodo glb, poiché imposto dalla interfaccia.
Devi accedere o registrarti per scrivere nel forum
14 risposte