Trait は Class を継承することもできます。継承のパターンを変えて、コンパイルしたときにできるクラスファイルをみてみました。
<前回観察したこと>
- Trait をコンパイルすると必ずクラスファイルが一つ TraitName.class (逆アセンブルするとインタフェース) できる。
- 具象メソッドをもつ Trait の場合はさらに TraitName$class.class (逆アセンブルするとアブストラクトクラス) ができる。
// Sample 1 (前回と同じ)
trait Animal
trait HasLegs extends Animal {
def legs: Int
}
trait HasFourLegs extends HasLegs {
def legs: Int = 4
}
コンパイルしてできるクラスファイルは以下。
- Animal.class // javapするとinterface
- HasLegs.class // javapするとinterface
- HasFourLegs.class // javapするとinterface
- HasFourLegs$class.class // javapすると abstract class
具象メソッドをもつ HasFourLegs Trait のみ、アブストラクトクラスが生成されます。
// Sample 2
abstract class Animal
trait HasLegs extends Animal {
def legs: Int
}
trait HasFourLegs extends HasLegs {
def legs: Int = 4
}
コンパイルしてできるクラスファイルは以下。
- Animal.class // javapすると abstract class
- HasLegs.class // javapすると interface
- HasFourLegs.class // javapすると interface
- HasFourLegs$class.class // javapすると abstract class
アブストラクトクラスが生成されるのは Sample 1 と同じく HasFourLegs のみ。HasLegs は Animalクラスを継承していますが生成されるのはインタフェースのみです。
// Sample 3
abstract class Animal
abstract class HasLegs extends Animal {
def legs: Int
}
class HasFourLegs extends HasLegs {
def legs: Int = 4
}
trait Mammal extends HasFourLegs
コンパイルしてできるクラスファイルは以下。
- Animal.class // javapすると abstract class
- HasLegs.class // javapすると abstract class
- HasFourLegs.class // javapすると class
- Mammal.class // javapすると interface
具象メソッドをもつクラスを継承している Mammal Trait ですが、.class しか生成されません。
どのような親をもつにせよ、Trait 自身が具象メソッドをもつ場合に限り、TraitName$class.class (中身はアブストラクトクラス) が生成されるようです。
0 件のコメント:
コメントを投稿