Вы не можете создать экземпляр интерфейса, т. Е. Вы не можете сделать
MyInterface foo = new MyInterface(); // Compile-time error.
Что вы можете сделать, это создать экземпляр класса, который реализует интерфейс. То есть, учитывая класс MyClass
public class MyClass implements MyInterface {
// ...
@Override
void method_one() {
// ...
}
@Override
int method_two() {
// ...
}
}
вы можете создать его экземпляр и поместить ссылку на него в вашу переменную следующим образом:
MyInterface foo = new MyClass();
Если у вас был другой класс, реализующий MyInterface
class MyClass2 implements MyInterface {
// ...
}
вы также можете подставить ссылку на экземпляр этого класса в вашей переменной:
MyInterface foo = new MyClass2();
В этом заключается сила интерфейсов: они определяют типы , а не конкретную реализацию и позволяют вам ссылаться на любую реализацию данного типа.
Очень хорошая практика программирования - создавать классы для реализации интерфейсов и использовать их для ссылки на экземпляры этих классов. Эта практика обеспечивает большую гибкость и повторное использование.
Следовательно, вы должны использовать аргументы и переменные типа интерфейса всякий раз, когда возможно, что различные реализации могут быть переданы в реализуемый вами метод. Например, если вы работаете с экземпляром HashSet<T>
, вы должны использовать переменную типа Set<T>
для ссылки на него (класс HashSet<T>
реализует интерфейс Set<T>
).