Sovrascrivi il metodo con sottoclasse come argomento

3

Quando vuoi che un metodo sopraffatto prenda come argomento una sottoclasse dell'argomento del metodo sottoposto a override, puoi farlo normalmente con i generici (come discusso in Modello di modello con tipi di input diversi nel metodo sottoposto a override ). Un esempio di ciò può essere visto nel mio methodA della classe Parent e Child

Mi chiedo se sia possibile fare la stessa cosa con un metodo che prende come argomento un oggetto della classe stessa (my methodB )

abstract class Super {}

class Sub extends Super {}

abstract class Parent<S extends Super> {
    abstract void methodA(S argument);
    abstract void methodB(Parent<S> parent);
}

public class Child extends Parent<Sub> {
    @Override
    void methodA(Sub argument) {}

    @Override
    void methodB(Child child) {}
}

Nel codice sopra methodB in Child non sovrascrive methodB da Parent .

Ovviamente potrei usare casting in methodB da Child come in:

public class Child extends Parent<Sub> {
    @Override
    void methodB(Parent<Sub> child) {
        (Child) child
    }
}

Ma come regola generale cerco di evitare il casting il più possibile.

È possibile avere un methodB sovrascritto in Child (con firma @Override void methodB(Child child) )? In tal caso, quale sarebbe la firma di methodB (in Parent )?

    
posta Maarten Dhondt 05.11.2016 - 19:34
fonte

1 risposta

4

Supponiamo che quello che volevi fosse possibile. Facciamo una lezione di un altro bambino:

public class Child2 extends Parent<Sub> {
    @Override
    void methodA(Sub argument) {}

    @Override
    void methodB(Child2 child) {}
}

Ora, cosa succede se ho questo:

Parent<Sub> child = new Child();
Parent<Sub> child2 = new Child2();
child.methodB(child2);

Il child è un puntatore di tipo Parent<Sub> , quindi è methodB che si aspetta un argomento di tipo Parent<Sub> - che è OK perché child2 è anche un puntatore di tipo Parent<Sub> . Ma l'oggetto child si riferisce a è di tipo Child , che è methodB accetta solo argomento di tipo Child - e child2 punta a un oggetto di tipo Child2 - che non è una sottoclasse di Child ...

    
risposta data 05.11.2016 - 22:43
fonte

Leggi altre domande sui tag