Мой код выглядит примерно так, но это упрощенная версия:
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");
}
}