インターフェース: 契約

実装を強制する抽象型。多重継承も可能。

インターフェース
契約(抽象メソッドの集合)。
default
デフォルト実装を提供。
関数型
抽象メソッド1つ。ラムダで実装。
Contract

interfaceは「契約書」です。 **契約** = 「XXXメソッドを必ず実装すること」 **署名** = implements 契約を結んだクラスは、必ずその約束を守る。

インターフェース

interface, implements
// インターフェースの定義
public interface Drawable {
void draw(); // 抽象メソッド
default void reset() { // デフォルトメソッド
System.out.println("Reset");
}
static void info() { // 静的メソッド
System.out.println("Drawable interface");
}
}
// 実装
public class Circle implements Drawable {
@Override
public void draw() {
System.out.println("Drawing circle");
}
}
// 使用
Drawable d = new Circle();
d.draw(); // Drawing circle
d.reset(); // Reset
Drawable.info(); // Drawable interface
実行結果
Drawing circle\nReset\nDrawable interface
Bad
// ❌ Bad: 具象クラスに依存
public void process(ArrayList<String> list) {
// ArrayList にしか使えない
}
Good
// ✅ Good: インターフェースに依存
public void process(List<String> list) {
// ArrayList, LinkedList 等すべてに対応
}

パターン

Multiple, Functional
// 複数インターフェースを実装
public class Robot implements Movable, Speakable {
@Override
public void move() { ... }
@Override
public void speak() { ... }
}
// 関数型インターフェース (Java 8+)
@FunctionalInterface
public interface Processor {
void process(String input); // 抽象メソッド1つだけ
}
// ラムダで実装
Processor p = input -> System.out.println(input);
p.process("Hello");
// 組み込み関数型インターフェース
Function<String, Integer> length = String::length;
Predicate<Integer> isEven = n -> n % 2 == 0;
Consumer<String> printer = System.out::println;
Supplier<Double> random = Math::random;
Tip: 具象クラスではなくインターフェースに依存する。

合格ライン

default メソッドを書ける
関数型インターフェースをラムダで実装できる

参考リンク

演習課題

課題1: インターフェース実装
Comparable を実装してオブジェクトをソートしてください。
課題2: default メソッド
default メソッドを持つインターフェースを作成してください。

次のステップ