なぜJavaでは多重継承できないの?

2020/10/08に公開

言語設計時の選択として、単純さ(Simple)を選んだ結果でしょう。
Javaの生みの親 James Gosling 氏による、1995年発行のWhitePaper "Java: an Overview" より引用します。

Simple
JAVA omits many rarely used, poorly understood, confusing features of C++ that in our experience bring more grief than benefit. This primarily consists of operator overloading (although it does have method overloading), multiple inheritance, and extensive automatic coercions.

多重継承(multiple inheritance)が意味する範囲は広く、「状態(state)の多重継承」、「実装(implementation)の多重継承」、「型(type)の多重継承」に分類できます。
公式The Java Tutorials, Multiple Inheritance of State, Implementation, and Type でも言及されている通り:

  • 状態(state)の多重継承:言語仕様上の選択としてサポートしない
  • 実装(implementation)の多重継承:Java8で導入された デフォルトメソッド(default method) でサポート
  • 型(type)の多重継承:インターフェイス(interface)継承でサポート

同WhitePaperで言及されるC++言語の場合、既定動作では「状態(state)の多重継承」により親クラスの状態が複数存在する振る舞いになります。
これを回避する機構として仮想継承(virtual inheritance)という言語機能をオプション提供しますが、比較的複雑で難解な機能です。C++ではプログラマに選択の自由度を与えますが、複雑で理解を難しくしているのも事実です。

// C++言語における「状態(state)の多重継承」

class B { int m1; };
// クラスD1,D2ともにクラスBを継承
class D1 : public B { ... };
class D2 : public B { ... };

// D1,D2を多重継承したクラスXのインスタンスには
// 親クラスBのインスタンスが 2 つ含まれる。
// つまりm1変数という「状態」が2つ同時に存在する。
class X : public D1, D2 {};

Java言語では、プログラマにこのような難しい選択をさせないという思想になっています。

Discussion