Java-класс, который требует использования интерфейса, если вы хотите использовать его метод
Если вы хотите использовать метод sort() из класса Arrays, вы ДОЛЖНЫ реализовать интерфейс Comparable. Это действительно хорошая идея - вы не можете сортировать объекты, если они не совместимы. Так что вы не можете сортировать, если вы не можете сравнить его ссылки. В этом случае интерфейс используется как проверка совместимости.
Вопрос - как я могу сделать:
класс с методом (может сделать что-то с 2 объектами)
интерфейс, который проверяет, совместимы ли эти 2 объекта (имеют совместимые ссылки)
добавить в мой класс правило "должен использовать этот интерфейс", чтобы вы не могли использовать этот метод класса без реализации определенного интерфейса, как это делает класс Comparable?
Пример:
public class Employee implements Comparable<Employee> {
//fields
//setters, getters
// this method must be implemented to use Arrays.sort()
public int compareTo(Employee other) {
return Double.compare(salary, other.salary);
}
}
2 ответа
Интерфейс не может ничего проверить.
Вы можете написать это:
interface One { }
interface Two { }
SomeType someMethod(One one, Two two) { ... }
Компилятор не позволит чьему-либо коду вызывать someMethod (a, b), если он не может доказать, что a является экземпляром некоторого класса, который implements One
и б является экземпляром некоторого класса, который implements Two
,
Это то, что вы спрашиваете?
Добавленная информация:
Arrays.sort(Object[] a)
отличается: компилятор не знает, реализуют ли элементы в массиве интерфейс Comparable или нет. Эта информация не доступна до времени выполнения.
Я не знаю, как это делает java.util.Arrays.sort(), но если вы хотите сделать то же самое в своем собственном коде, вы можете написать это:
interface One { }
interface Two { }
SomeType someMethod(Object oneAsObject, Object twoAsObject) {
One one = One.class.cast(oneAsObject);
Two two = Two.class.cast(twoAsObject);
...
}
Это отличается от моего первого примера, потому что компилятор позволит вам передать любой тип объекта, но функция вызовет исключение ClassCastException во время выполнения, если передан неправильный тип объекта.
Но почему вы хотите подождать до времени выполнения, чтобы найти ошибку, которую вы могли найти во время компиляции? (например, зачем ждать, пока спускаемый аппарат спускается к поверхности Марса, чтобы найти роковой недостаток, который вы могли бы найти до его запуска?)
Отвечая на ваш комментарий:
Да, я имею в виду следующее: если вы не хотите использовать sort(), вы должны реализовать метод сопоставления. Итак, вопрос в том, могу ли я определить, что вы должны использовать какой-то интерфейс X, если хотите использовать мой метод X.
Вы можете сделать это с помощью абстрактного класса.
public interface MyInterface {
public void methodA();
}
public abstract class MyAbstractClass implements MyInterface {
public void methodB(
System.out.println("Pop");
)
}
Все, что хочет использовать methodB
должен продлить MyAbstractClass
и, следовательно, должны реализовать MyInterface
,