class Fighter extends Unit implements Fightable { // Unit 클래스 상속, Fightable 인터페이스 구현
public void move(int x, int y) {}
public void attack(Fightable f) {}
}
Unit u = new Fighter(); // 다형성
Fightable f = new Fighter();
(중요!!) 인터페이스 타입의 매개변수는 인터페이스 구현한 클래스의 객체(인스턴스)만 올 수 있다.
interface Fightable {
void move(int x, int y);
void attack(Fightable f); //매개 변수 Fightable타입이 인터페이스
// attack메소드는 매개변수로 Fightable 인터페이스를 구현한 클래스 객체만 받겠다.
}
Fightable method() { // 리턴타입 : 인터페이스
Fighter f = new Fighter(); // fighter객체가 Fightable을 구현.
return (Fightable) f; // fighter 객체를 반환.
위의 두 문장은 return new Fighter(); 와 같다.
⇒ 메소드의 리턴타입에 인터페이스가 오는 것? Fightable 인터페이스를 구현한 클래스의 인스턴스를 반환한다.
→ 원래 반환타입하고 반환값이 같아야하는데, fighter(자손)가 Fightable(조상)로 형변환 가능하기 때문에 괜찮음.
출처
- 자바의 정석 기초편 - ch 7-38