Здравствуйте, rus blood, Вы писали:
RB>Почему нельзя вынести одинаковые поля в общий класс?
Это называется duck typing. И во многих ЯП нет такого принципиально. Т.к. это создаёт неявную связь между типами.
Можно размотать через лямбды:
<T> void printValue(Supplier<String> value) {
System.out.println(value.get());
}
...
var a = new A();
printValue(a::value);
var b = new B();
printValue(b::value);
По классике ООП можно делать адаптеры (удобно в случае если методов больше одного):
interface ValueAdapter
{
String value();
static ValueAdapter wrap(A a) {return () -> a.value;}
static ValueAdapter wrap(B b) {return () -> b.value;}
}
void printValue(ValueAdapter adapter) {
System.out.println(adapter.value());
}
var a = ValueAdapter.wrap(new A());
printValue(a);
var b = ValueAdapter.wrap(new B());
printValue(b);
Можно через рефлексию. Но лучше не нужно.