Все сказанное в отношении преобразования типов характерно и для интерфейсов. Например, так как класс реализует некоторый интерфейс, то объект этого класса также является объектом реализуемого интерфейса. Например, рассмотрим следующую программу:
public class Program{
public static void main(String[] args) {
Movable tesla = new Car("Tesla");
tesla.move();
}
}
interface Movable{
void move();
}
// класс машины
class Car implements Movable{
private String model;
Car(String model){ this.model = model; }
public void move(){
System.out.println("Едем на машине");
}
public void print(){
System.out.println("Модель: " + model);
}
}
Здесь класс Сar реализует интерфейс Movable, соответственно переменная типа Movable может хранить ссылку на объект типа Car.
И если мы хотим обратиться к методам класса Car, которые определены не в интерфейсе Movable, а в самом классе Car, то нам надо явным образом выполнить преобразование типов:
public class Program{
public static void main(String[] args) {
Movable tesla = new Car("Tesla");
tesla.move();
((Car) tesla).print(); // Модель: Tesla
// или через вспомогательную переменную
Car someCar = (Car) tesla;
someCar.print(); // Модель: Tesla
}
}
И также как и в случае с классами, интерфейсы могут использоваться в качестве типа параметров метода или в качестве возвращаемого типа. В качестве тпараметров методов и возвращаемых результатов, которые представляют интерфейс, можно использовать объекты классов, которые применяют данный интерфейс:
public class Program{
public static void main(String[] args) {
Car car = new Car();
travel(car);
Movable boing = new Aircraft();
travel(boing); // Летим на самолете
}
static void travel(Movable obj) {
System.out.println("Отправляемся в путешествие");
obj.move();
}
}
interface Movable{
void move();
}
// класс машины
class Car implements Movable{
public void move(){
System.out.println("Едем на машине");
}
}
class Aircraft implements Movable{
public void move(){
System.out.println("Летим на самолете");
}
}
В данном случае метод travel (условная функция путешествия на транспорте) в качестве параметра получает объект Movable. Это может быть машина, и самолет, и любой другой объект, класс которого реализует интерфейс Movable. Какой конкретно это будет объект, мы не знаем. Мы лишь знаем, что этот объект должен реализовать интерфейс Movable, а значит, иметь метод move.
Консольный вывод:
Отправляемся в путешествие Едем на машине Отправляемся в путешествие Летим на самолете
ПРимер с возвращением объекта интерфейса:
public class Program{
public static void main(String[] args) {
Movable car = createMovable(true);
car.move();
Movable aircraft = createMovable(false);
aircraft.move();
}
static Movable createMovable(boolean isCar) {
if(isCar) return new Car();
return new Aircraft();
}
}
interface Movable{
void move();
}
// класс машины
class Car implements Movable{
public void move(){
System.out.println("Едем на машине");
}
}
class Aircraft implements Movable{
public void move(){
System.out.println("Летим на самолете");
}
}
Метод createMovable() в качестве результата возвращает объект интерфейса Movable. В качестве параметра метод принимает булевое значение, которое указывает, объект какого именно класса
будет создаваться: если true, то создается объект Car, иначе создается объект Aircraft..