今日は、Javaでの共分散、反分散(および不変)に関する記事を読みました。英語とドイツ語のウィキペディアの記事、およびIBMの他のブログ投稿と記事を読みました。
しかし、私はまだこれらが正確に何であるかについて少し混乱していますか?型とサブタイプの関係に関するもの、型変換に関するもの、メソッドがオーバーライドされるかオーバーロードされるかを判断するために使用されると言う人もいます。
だから私は簡単な説明を簡単な英語で探しています。それは初心者に共分散と反分散(および不変性)が何であるかを示しています。簡単な例のプラスポイント。
Java型システムを取得し、クラスを取得する:
何らかのタイプTのオブジェクトは、Tのサブタイプのオブジェクトに置き換えることができます。
型の差異-クラスメソッドには次の結果があります
class A {
public S f(U u) { ... }
}
class B extends A {
@Override
public T f(V v) { ... }
}
B b = new B();
t = b.f(v);
A a = ...; // Might have type B
s = a.f(u); // and then do V v = u;
次のことがわかります。
現在、BはAのサブタイプであることに関連しています。次のより強力なタイピングは、より具体的な知識を使って導入できます。サブタイプ。
共分散(Javaで利用可能)は、サブタイプでより具体的な結果を返すと言うのに便利です。特にA = TおよびB = Sの場合に見られます。反分散は、より一般的な議論を処理する準備ができていると言います。