Kotlinのtraitとabstractの違い

Kotlinを勉強していたらtraitという機能がでてきて、「abstractと何が違うねん」と思ったのでその違いを調べました。
(至極当たり前の内容です)

結論

abstractは単一継承しかできないが、traitは多重継承(Mixin)できる。

Kotlinのtraitとは

Kotlinのtraitはabstractと似ていて、直接インスタンス生成できません。
そして、抽象メソッドや実装されたメソッドを持たせることができます。

多重継承

それなら「abstractと何が違うねん」ってなりますが、traitは多重継承できるという違いがあります。
多重継承はJavaではできず、interfaceを複数implementsする必要がありました。
その代わりJavaのinterfaceは実装を持っていなかったのでimplementsした複数のinterfaceに同一のメソッドが定義されていても問題がありませんでした。

一方で、Kotlinのtraitは実装を持つことができるので多重継承は危険なのでは?と思いましたが、
多重継承したときに実装されている同一シグネチャのメソッドが存在した場合コンパイルエラーになります。
おかげで安心、というわけです。

至極当たり前のことだと思いますが、Kotlinを触り始めて気になったので書きました!