Переопределение проблем

Мой код выглядит примерно так, но это упрощенная версия:

class A:

public class A{
    public void testArgs(A a){
        System.out.println("A");
    }
    public void test(){
        System.out.println("A");
    }
}

class B:

public class B extends A{
    public void testArgs(B a){
        System.out.println("B");
    }
    public void test(){
        System.out.println("B");
    }
}

class Main:

public class Main{
    public static void main(String[] args){
        a(new B()).testArgs(new B()); // prints A
        (new B()).testArgs(new B());  // prints B
        a(new B()).test();            // prints B
    }
    public static A a(B b){
        return b;
    }
}

Почему a(new B()).testArgs(new B()) печатает A, а не B? Есть ли какой-то способ обойти/исправить это?

edit:
. Уточнение:

На самом деле я хочу, чтобы метод суперкласса выполнялся при вызове с A, а метод подкласса - при вызове testArgs с B.

Кастинг тоже не вариант, потому что в реальном коде, в отличие от этого, я не знаю, будет ли результатом вызова метода на самом деле B или нет.

edit:
. Решение:

Спасибо всем за ответы. Спасибо за разъяснение по поводу переопределения. Я использовал это для реализации желаемого поведения.
Для всех, у кого возникнет подобная проблема в будущем:

public class B extends A{
    public void testArgs(A a){       // Corrected overriding, thanks
        if(a instanceof B)           // Check if it is an instance of B
            System.out.println("B"); // Do whatever
        else                         // Otherwise
            super.testArgs(a);       // Call superclass method
    }
    public void test(){
        System.out.println("B");
    }
}
6
задан jgon 6 October 2011 в 01:55
поделиться