Мой код выглядит примерно так, но это упрощенная версия:
класс A:
public class A{
public void testArgs(A a){
System.out.println("A");
}
public void test(){
System.out.println("A");
}
}
класс B:
public class B extends A{
public void testArgs(B a){
System.out.println("B");
}
public void test(){
System.out.println("B");
}
}
класс 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?
Есть ли какой-нибудь способ обойти / исправить это?
редактирование:
Уточнение:
Что мне действительно нужно, так это метод суперкласса, запускаемый при вызове с A, и метод подкласса, запускаемый при вызове testArgs с B.
Приведение также не является вариантом, потому что в реальном коде, в отличие от этого, я не знаю, является ли результат вызова метода на самом деле B или нет.
редактирование:
Решение:
Спасибо всем за ваши ответы. Спасибо за разъяснения по переопределению. Я использовал это для реализации желаемого поведения.
Для тех, у кого есть подобные проблемы в будущем:
Изменить класс B на
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");
}
}