2011-12-20 4 views
9

例の本を読んでScalaのを読むと、マーティンは、54ページの境界を入力について説明し、この例があります:例によるスカラ - コンテキスト境界の間違いによる特性型パラメータ?

trait Set[A <: Ordered[A]] { 
    def incl(x: A): Set[A] 
    def contains(x: A): Boolean 
} 

trait Set[A <% Ordered[A]] ... 

はさらに55ページの彼はまた言いますが、その<:/型境界の可能性を示すために、特性セットに必要な唯一の変更は<%です。

しかし、自分のコードでこの例を繰り返すと、IDEは特性がビュー境界を持たず、タイプ境界のみを持つ可能性があると訴えています。 traitキーワードを抽象クラスに変更するか、型バインドにバインドされたビューを変更することができます。これは本の間違いですか?

+3

"Scala by Example"を書いた後、仕様に変更がありました。 [このディスカッション](http://scala-programming-language.1934581.n4.nabble.com/scala-view-bound-in-trait-td1991172.html) –

+0

を指摘してくれてありがとう!しかし、私は、実装の複雑さが言語に影響を与えるのは良くないと思います。なぜ形質に上限がないのかについての論理的説明はない。 – noncom

+3

形質には上限があります。これらはコンストラクタパラメータであり、特性はコンストラクタパラメータを持つことができないため、コンテキストとビューの境界を持つことはできません。 –

答えて

7

のは、私たちの強力なツールを使用してみましょうが何が起こっているか理解するためにREPLと呼ばれる:

scala> trait Example[A<:Ordered[A]] { def contains(x:A):Boolean } 
defined trait Example 

scala> class Example2[A<%Ordered[A]](val a:A) { def isLower(otherA:A):Boolean = a< otherA } 
defined class Example2 

scala> :javap Example 
Compiled from "<console>" 
public interface Example{ 
    public abstract boolean contains(scala.math.Ordered); 
} 


scala> :javap Example2 
Compiled from "<console>" 
public class Example2 extends java.lang.Object implements scala.ScalaObject{ 
    public java.lang.Object a(); 
    public boolean isLower(java.lang.Object); 
    public Example2(java.lang.Object, scala.Function1); 
} 

あなたが見ることができるように、バインドビューは、例2のコンストラクタの第2引数になります。形質にはコンストラクタがないため、ビューをバインドすることはできません。これは、以前のリリースで可能になったのはなぜ

私にScalaの進化についてのご質問については謎(多分、追加機能1 valは、形質内に作成し、コンパイラによって満たされた?)

で、それは成熟しており、強力です。メジャーリリース(2.8,2.9,2.10)の間で変更が期待できますが、スカラはこれほど十分に成熟していないとは考えていません。しかし、常に改善の余地があります。

関連する問題