何故Javaでは多重継承は許されていないのか


開発中に気になったのですが何故Javaは多重継承が許されていないのですか？  
調べてみると

> メソッド名が重複した場合の処置など、多重継承が様々な問題を引き起こしやすいからです

とのことですが、それなら多重継承しているクラスは必ずオーバーライドすればいいと思ったのですが。  
また、`super.method()`のようにする時も多重継承しているなら`super.AClass.method()`のようにすれば困ることがあまりないと思います。  
(一応言っておきますがinterfaceの多重継承ではありません。どちらもクラスの時です)




言語設計時の選択として、単純さ(Simple)を選んだ結果でしょう。Javaの生みの親 James
Gosling氏による、1995年発行のWhitePaper ["Java: an
Overview"](http://www.cs.dartmouth.edu/~mckeeman/cs118/references/OriginalJavaWhitepaper.pdf)
より引用します。

> **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](https://docs.oracle.com/javase/tutorial/java/IandI/multipleinheritance.html)
でも言及されている通り：

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

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

[code]

    // 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 {};
    
[/code]

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




言語設計時の選択として、単純さ(Simple)を選んだ結果でしょう。Javaの生みの親 James
Gosling氏による、1995年発行のWhitePaper ["Java: an
Overview"](http://www.cs.dartmouth.edu/~mckeeman/cs118/references/OriginalJavaWhitepaper.pdf)
より引用します。

> **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](https://docs.oracle.com/javase/tutorial/java/IandI/multipleinheritance.html)
でも言及されている通り：

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

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

[code]

    // 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 {};
    
[/code]

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

