Мне удалось придумать что-то, что, кажется, работает:
public static <T extends BaseType> boolean areFieldsEqual(T left, T right, Function<T,? extends Comparable>... fields)
{
if (fields.length < 1) {
return true;
}
Comparator<T> c = Comparator.comparing(fields[0]);
for (int i = 1; i < fields.length; i++) {
c = c.thenComparing (fields[i]);
}
return c.compare(left, right) == 0;
}
Тестовые классы:
class BaseType {
String x;
int y;
public BaseType (String x, int y) {
this.x=x;
this.y=y;
}
String getX () {return x;}
int getY () { return y;}
}
class SubType extends BaseType {
String z;
public SubType (String x, int y,String z) {
super(x,y);
this.z=z;
}
String getZ () {return z;}
}
Использование:
BaseType one = new BaseType("some",1);
BaseType two = new BaseType("some",2);
SubType three = new SubType("some",1,"else");
SubType four = new SubType("some",2,"else");
System.out.println (areFieldsEqual(one,two,BaseType::getX,BaseType::getY));
System.out.println (areFieldsEqual(three,four,SubType::getZ,BaseType::getX));
Вывод:
false
true