Если вы хотите, чтобы ваши объекты SizeComparable сравнивались не со всеми другими объектами SizeComparable, а только с объектами некоторого типа, вы можете использовать универсальные типы.
interface SizeComparable<X> {
/**
* returns true if this object is higher than that object.
*/
boolean isHigher(X that);
}
Тогда вы можете создать свои реализации следующим образом:
public class Interesting implements SizeComparable<Interesting> {
...
public boolean isHigher(Interesting obj) {
return this.getHeight() > obj.getHeight();
}
}
Или вы могли бы даже иметь другой интерфейс
public interface HeigthHaving extends SizeComparable<HeightHaving> {
/**
* returns the height of this object.
*/
public int getHeigth();
/**
* compares this object's height with another objects height.
* @return true if this.getHeight() > that.getHeight, else false.
*/
public boolean isHigher(HeightHaving that);
}
Теперь каждая реализация HeightHaving должна реализовывать метод isHigher(HeightHaving)
(это было бы так, даже если бы мы не повторяли его здесь), и должна делать это в соответствии с приведенной здесь спецификацией. Однако на другие реализации SizeComparable это не влияет.
Хорошая вещь здесь в том, что теперь, например, алгоритмы сортировки могут сортировать списки / массивы любого типа X, реализующие SizeComparable, так что вам не нужно записывать его снова для каждого нового типа объекта, который вы можете отсортировать по высоте.
(На самом деле, в стандартном API уже есть подобный интерфейс Comparable<X>
. Возможно, вы захотите использовать его вместо SizeComparable
.)
Кстати, для isXXX
метода обычно логический тип возвращаемого значения является более разумным, чем целое число.