web-dev-qa-db-ja.com

共分散、不変性、および反分散は平易な英語で説明されていますか?

今日は、Javaでの共分散、反分散(および不変)に関する記事を読みました。英語とドイツ語のウィキペディアの記事、およびIBMの他のブログ投稿と記事を読みました。

しかし、私はまだこれらが正確に何であるかについて少し混乱していますか?型とサブタイプの関係に関するもの、型変換に関するもの、メソッドがオーバーライドされるかオーバーロードされるかを判断するために使用されると言う人もいます。

だから私は簡単な説明を簡単な英語で探しています。それは初心者に共分散と反分散(および不変性)が何であるかを示しています。簡単な例のプラスポイント。

106
anon

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;

次のことがわかります。

  • TはサブタイプS(共変、BはAのサブタイプ)でなければなりません。
  • VはUのスーパータイプでなければなりません(contravariant、コントラ継承方向として)。

現在、BはAのサブタイプであることに関連しています。次のより強力なタイピングは、より具体的な知識を使って導入できます。サブタイプ。

共分散(Javaで利用可能)は、サブタイプでより具体的な結果を返すと言うのに便利です。特にA = TおよびB = Sの場合に見られます。反分散は、より一般的な議論を処理する準備ができていると言います。

11
Joop Eggen