Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di el92
    Registrato dal
    Dec 2014
    Messaggi
    177

    [java]errore metodo astratto

    Ciao svolgendo un esercizio di una classe stratta:

    codice:
    abstract class Blocco implements Comparable<Blocco>{
        String colore;
    Blocco(String jolly){
        this.colore=jolly;
    }
    public String getColore(){
        return colore;
    }
    public abstract boolean npuoStareSopra(Blocco b);
    public abstract int compareTo(Blocco y);
    }
    fin qui tutto ok...poi:

    codice:
    class BloccoNumerato extends Blocco {
        String colore;
        int numero;
    BloccoNumerato(String colore,int numero){
        super(colore);
        this.numero=numero;
    }
    public boolean npuoStareSopra(BloccoNumerato b){
        if(b.colore!=null && b.colore.equals("JOLLY")){
            return true;
        }else
        return false;
    }
    public int compareTo(BloccoNumerato bn)    {
        int color=colore.compareTo(bn.colore);
            return color;
        }
    }
    e qui il problema...ho implemtetao tutti i metodi astratti della superclasse(astratta) e il compilatore mi segnale un errore di BloccoNumerato is not abstract and does not override abstract method compareTo(Blocco) in Blocco...perchè mi esce questo errore?

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Perchè il metodo che hai implementato tu ha una firma diversa (è un overload, non un override).
    Nel metodo compareTo() di BloccoNumerato hai messo come parametro un oggetto di tipo BloccoNumerato, mentre quello della superclasse astratta vuole un oggetto di tipo Blocco (che è più generale di BloccoNumerato). Siccome per concretizzare la classe devi fare l'override, allora devi rispettare la firma del metodo astratto.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Aggiungo che questo è un limite, dovuto alla "erasure", dei generics. La implementazione di una interfaccia generica in una classe X fissa la parametrizzazione della interfaccia per tutte le sottoclassi.
    In altre parole, se Blocco è Comparable<Blocco>, nelle sottoclassi NON è possibile cambiare la parametrizzazione di Comparable a qualcos'altro.

    BloccoNumerato NON può essere dichiarato Comparable<BloccoNumerato> e pertanto un eventuale override di compareTo deve mantenere il parametro Blocco. Ovviamente può cambiarne il comportamento.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it L'avatar di el92
    Registrato dal
    Dec 2014
    Messaggi
    177
    ah ok quindi dipende dal fatto che ho dichiarato la classe come implemetazione di comparable<Blocco>..se ho capito bene..nel riscrivere i metodi(override) non è possibilile utilizzare come parametro una superclasse...questo è possibile solo nell'overload...giusto?
    Ultima modifica di el92; 11-05-2015 a 16:57

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da el92 Visualizza il messaggio
    ah ok quindi dipende dal fatto che ho dichiarato la classe come implemetazione di comparable<Blocco>..se ho capito bene..nel riscrivere i metodi(override) non è possibilile utilizzare come parametro una superclasse...questo è possibile solo nell'overload...giusto?
    Se cambiano i parametri (tipi, quantità) è un overload (indipendentemente che sia tra due classi in relazione o nella stessa classe). Per un override i parametri devono essere gli stessi. Nota: gli stessi tenendo presente il concetto di "override equivalent" che considera anche la "subsignature".

    Ovvero, questo:

    codice:
    class A {
        public void test(List<String> lista) { }
    }
    
    class B extends A {
        public void test(List lista) { }
    }

    è perfettamente lecito. test di B è un override sebbene il parametro non sia esattamente uguale. Perché test di B è uguale alla "erasure" di test di A.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it L'avatar di el92
    Registrato dal
    Dec 2014
    Messaggi
    177
    Ciao grazie per la spiagazione...sei stato chiarissimo

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 © 2025 vBulletin Solutions, Inc. All rights reserved.