Как работает метод over riding, если сигнатура метода остается неизменной, но общие параметры отличаются? - PullRequest
2 голосов
/ 29 февраля 2012

Я пробовал следующий пример:

class BaseClass {
    public void methodA(Class<?> cl) {
        System.out.println("Base.methodA()");
    }
}

class SubClass extends BaseClass {
    public void methodA(Class cl) {
        System.out.println("Sub.methodA()");
    }
}

public class OverrideEx {

    public static void main(String[] args) {
        BaseClass b = new BaseClass();
        BaseClass s = new SubClass();

        b.methodA(Class.class);
        s.methodA(Class.class);
    }
}

Выход: Base.methodA () Sub.methodA ()

Но если я перехожу на аргумент метода верховой езды, то наоборот:

class BaseClass {
    public void methodA(Class cl) {
        System.out.println("Base.methodA()");
    }
}

class SubClass extends BaseClass {
    public void methodA(Class<?> cl) {
        System.out.println("Sub.methodA()");
    }
}

public class OverrideEx {

    public static void main(String[] args) {
        BaseClass b = new BaseClass();
        BaseClass s = new SubClass();

        b.methodA(Class.class);
        s.methodA(Class.class);
    }
}

Я получаю ошибку компиляции. В нем говорится: «Столкновение с именем: метод methodA (Class) типа SubClass имеет такое же стирание, что и methodA (Class) типа BaseClass, но не переопределяет его».

Почему это?

Ответы [ 2 ]

2 голосов
/ 29 февраля 2012

Параметризованный тип Class<?> является подтипом необработанного типа Class 4.10.2 ).

Таким образом, для любого x вызов s.methodA(x) в первом примере также будет действительным, если переписать:

((BaseClass)s).methodA(x)

Это не верно для второго примера.

Представьте себе x типа Class, который не является подтипом Class<?>. Этот звонок будет недопустимым, потому что тип аргумента не является подтипом типа формального параметра.

Это означает, что methodA из SubClass не отменяет methodA из BaseClass.

0 голосов
/ 29 февраля 2012

В соответствии с JLS , вы можете переопределить метод, если (среди прочего): Подпись m1 является подписью (§8.4.2) подписи m2.

Это означает, что ( JLS снова ):
- m2 имеет ту же подпись, что и m1, или
- подпись m1 совпадает с удалением подписи m2.

При попытке переопределить methodA вы стираете тот же тип, но у вас нет той же подписи. В этой самой главе JLS обсуждается вопрос, который вы описываете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...