2017-01-30 3 views
0

インナークラスタイプを参照する:それは得るようなスカラ - Iは次のように、外側のコンストラクタでインナークラスタイプにアクセスしたい外側のクラスのコンストラクタ

// does not compile, MyInner now know from outer constructor 
class MyOuter(private val mySet: Set[MyInner]) { 
    class MyInner(index: Int) 
} 

内部クラスは、(対象外)、非静的である必要があります外部クラスインスタンスのいくつかのフィールドにアクセスします。

以下のコードはコンパイルされますが、フィールドは変更可能です:

class MyOuter() { 
    class MyInner(index: Int) 

    private var mySet: Set[MyInner] = _ 
    def this(_mySet: Set[MyInner]) { 
    this() 
    mySet = _mySet 
    } 

これは、Javaコード下に合法であるとして、Scalaの固有のようです:あなたの助け

ため

import java.util.Set; 

public class Outer { 

    private final Set<Inner> mySet; 

    public class Inner { 
     private final int index; 

     public Inner(int _index) { 
      index = _index; 
     } 
    } 

    public Outer(Set<Inner> _mySet) { 
     this.mySet = _mySet; 
    } 

} 

感謝

+1

コンストラクタがあなたのものに関して定義された型の引数を取ることは意味がありません構築しようとしている。 – emilianogc

+0

@emilianogcどのパターンをお勧めしますか? – ogen

+0

あなたが達成しようとしていることがわかりません。 MyOuterのCTORに外部から新しいMyInnerをインスタンス化することはできません。 Javaの内部クラスでは、他の何かを意味します。 – Maxim

答えて

1

このフレーズは:「インナークラスは、外部クラスインスタンスのいくつかのフィールドにアクセスできるため、非静的(オブジェクトの外側)でなければなりません。あなたが望むものがなぜ不可能であるかを説明します。つまり、がまだ存在しない別のクラスのインスタンスのフィールドにアクセスするクラスのインスタンスを作成しようとしています

いいえ、Javaでは動作しません。あなたのコメントで参照した質問への回答のstatic修飾子に注意してください。内部クラスをコンパニオンオブジェクトに移動するのと同じ効果があります。つまり、Javaの静的内部クラスは外部クラスの静的メンバーにのみアクセスできます。

これは、私の思うように、あなたのケースに適した解決策になるでしょう - コンパニオンオブジェクトを作成し、内部クラスをそこに移動します。いいえ、まだ構築されていないインスタンスのメンバーにアクセスする必要はありません:)

関連する問題