Javaの共変
日経ソフトウェア読んでいたら初めて知ったのでメモ。
共変とは子クラスは親クラスのメソッドをオーバーライドする時に、メソッドの型も子クラスの型にしてもいいという機能。
ジェネリクスではサポートされていない。
String型をObject型に代入できるのはアップキャストではなく、同じObject型を親に持つ子同士の共変。
クラスの型とメソッドの型が共に変わるから共変っていうのかな?
サンプル
//CatとDogはAnimalの子クラス class Animal { } class Cat extends Animal { } class Dog extends Animal { } public class Program { public static void main(String[] args) { DerivedA der = new DerivedA(); Cat cat = der.get(); } } //親クラスからオーバーライドした子クラスのメソッドの型は //親クラスのメソッドの型の子クラス型に変えることができる class Base { public Animal get() { return new Animal(); } } class DerivedA extends Base { @Override public Cat get() { return new Cat(); } } //子クラスならば何でもいい class DerivedB extends Base { @Override public Dog get() { return new Dog(); } }