2017-02-17 7 views
-1

Scalaのインナークラスが外部クラスオブジェクトにバインドされ、Javaなどの外部クラス自体にバインドされない理由を理解できません。誰かがその背後にある論理を説明することはできますか? Scalaの開発者がInner Classをこのように定義したのはなぜですか?Scalaのインナークラスが外部クラスオブジェクトにバインドされている理由

Scalaでは内部クラスのようにまったく同じ意味を持ってJavaで

class Network 
{ 
    class Member() 
    { 
    val contacts = new ArrayBuffer[Member] 
    } 
} 


object checkInner extends App { 

/// creating home network 
    val home = new Network 
    val father = new home.Member 
    val mom = new home.Member 
    val sister = new home.Member 

    father.contacts += mom 
    father.contacts += sister 

// creating neighbour network 
    val neighbour = new Network 
    val uncle = new neighbour.Member 

    father.contacts += uncle (this will throw error -> type mismatch; found :  
     checkInner.neighbour.Member required: checkInner.home.Member) 
     ** but it will work in Java ** 
} 
+0

Javaがまさにそのようなものだと分かりますか?唯一の違いは、Javaが静的内部クラスを含む静的メンバーをサポートしていることです。 – pedrofurla

+0

あなたは正確に何を提案しようとしていますか?あなたはそれを詳しく教えてもらえますか?ありがとうございました – jack

+0

私は1つの質問か尋ねたことがあり、声明を出しました。私はそれよりも明白にする方法を知らない。 – pedrofurla

答えて

1

非静的な内部クラスの下の例を参照してください。 (塩の穀物でそれを取る、両方の言語の型システムの違いは、そのステートメントを無効にするいくつかのものを導入するかもしれませんが、これらは私が説明しようとしているものとは無関係です)。

Javaでは、内部(非静的)クラスには、その作成に使用された外部クラスのインスタンスへの参照が含まれています。

ContainingClass container = new ContainingClass(); 
HashPerson william = container.new HashPerson("willy"); 

https://stackoverflow.com/a/4070777/480674から取られた)

方法を予告container:内部クラスのインスタンス化のための構文は、それは非常に明確な(Javaの場合のHashPersonためContainingClassにおける非静的内部クラスであると仮定)を行いますこの.newがコンテナのメンバーであるかのように、.newの左側にあります。 Scalaの場合はnew container.HashPerson("willy");となり、両方の言語でHashPersonインスタンスがになると、外部クラスのインスタンスにが依存します。

内部クラス(Javaの場合は非静的)に関する2つの言語の唯一の違いは、Scalaにはというパスの概念があるということです。型です。しかし、それは全く異なる答えです。

+1

私はhttp://docs.scala-lang.org/tutorials/tour/inner-classes.htmlでその言葉が信じていたと信じています。実際にはパス依存型に関するものです。 (そのページには、IMOの見直しが必要ですが、それはパスに依存するタイプですが、それらの言葉を使用することはありません) –

+0

ええ、今は実現しました。 – pedrofurla

+0

残念ながら、私はパス依存型の最も良い説明がどこにあるのか分かりません。 http://stackoverflow.com/questions/5581836/why-does-scala-have-path-dependent-types?rq=1 and http://stackoverflow.com/questions/2693067/what-is-meant-by- scalas-path-dependent-type?rq = 1はそれほど大きくありません。 –

関連する問題