2016-04-06 8 views
0

はい!この質問のもう一つは、はい、私はすでにstackoverflowでこの質問の多くを読んで、まだこの概念とそのアプリケーションを理解していない。スカラ協同とコントラスト変動

私はScalaの新しい人です。多くの人のように、私はまだContravarianceという概念を得ていませんでした。私はProgramming Scala第2版を読んでいます。そして、283ページで、次の例でcontravariance:Javaで考える

var f: C => C = (c: C) => new C 
    f   = (c: CSuper) => new CSub 
    f   = (c: CSuper) => new C 
    f   = (c: C) => new CSub 
    f   = (c: CSub) => new CSuper // COMPILATION ERROR! 

class CSuper { def msuper() = println("CSuper") } 
class C extends CSuper { def m() = println("C") } 
class CSub extends C { def msub() = println("CSub") } 

その後、機能や使用のいくつかの例があります:

は、階層構造を与えますCSuperはCSubのスーパータイプなので、最後の式はコンパイルされません。

私は理解できないことは、この場合、関数1 [-C、+ C]の型が最初のパラメータで反変であることを意味しますか?

本はcontravarianceためwhere X[String] is a supertype of X[Any], for some type X.

コ/ contravarianceは、パラメータ化された型のサブクラスでちょうどappliableあるときに我々は機能1を使用しているので、私が意味する、分散はちょうど、機能1のサブタイプに適用されていることを述べていますそれだろうか?

実際にどのように機能し、いつ使用する必要がありますか?

+0

"私はすでにstackoverflowでこの質問をたくさん読んでいますが、まだ理解していません..." - あなたが書くことができることについてのあなたの質問には本当に有用な示唆はありません。あなたがすでに読んだもの。あなたはここでいくつかの質問をしましたが、それらのすべてが非常に幅広く、それらのすべてが重複しています。 –

+0

@SethTisue、ええ、私はすでに読んでいる質問は、私が探している知識を持っていると思うが、彼らが答えられる方法は私には分かりません、私は誰かが多分別の方法で説明することを望んでいた。 –

+0

@KennedyOliveira Liskovの置換原理を探します。 – pedrofurla

答えて

2

T 'がTのサブクラスである場合、Container [T']はContainer [T]のサブクラスと見なされますか?

[+T]共変:C [Tは '] Cのサブクラスである[T]、
[-T]反変: C [T] Cのサブクラスである[T']

Function1trait Function1[-T1, +R]と定義されているので、パラメータは反変的であり、結果の型は共変である。

つまり、引数がスーパータイプ与えられた関数の引数の型のであり、および機能は、タイプが与えられた関数の結果の型のサブタイプで生じること自体与えられた関数のサブタイプです。

例では、タイプC => Cfに異なる関数宣言を割り当てるので、有効なサブタイプの割り当てのみがコンパイルされます。

はすなわち、これらだけ関数宣言はC => Cの有効なサブタイプです:

var f: C => C = (c: C) => new C 
f   = (c: C) => new C 
f   = (c: C) => new CSub 
f   = (c: CSuper) => new C 
f   = (c: CSuper) => new CSub 

他のすべてがC => Cのいずれかのスーパータイプであるとfまたは無関係なタイプに割り当てることはできません。

関連する問題