C++と色々

主にC++やプログラムに関する記事を投稿します。

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();
	}
}