2016-08-09 210 views
1
class B(i:Int) { 
    var v = new M(i) 
    class M(i: Int) { 
    val x = i 
    println("Creating a new M") 
    println(s"x = $x") 
    } 
} 


val b = new B(1) 
val c = new B(2) 
b.v = c.v 

如何使用c.v更改b中的變量v以及爲什麼我不能這樣做?更改類中的變量

+1

在內部類的詳細信息http://danielwestheide.com/blog/2013/02/13/the-neophytes-guide-to-scala-part-13-path-dependent -types.html –

回答

3

之所以你不能做這樣的任務是因爲M類是非靜態。不像java每個外部類實例都有它自己的內部類,所以b.vc.v的不同類型的實例因此你不能簡單地做賦值。

你可以做的是使用伴侶,對象

  1. 聲明M Scala的方式靜態
object B { 
    class M(i: Int) { 
    val x = i 
    println("Creating a new M") 
    println(s"x = $x") 
    } 
} 

class B(i:Int) { 
    import B._ 
    var v = new B.M(i) 
} 
使用 相同的實例
  • 分配B
  • b.v = new b.M(2) 
    

    你可以找到scala-lang.org

    +0

    我會說你在那裏的第一句話是不正確的。該引用隱藏在封閉內。 – wheaties

    +0

    @wheaties ...從技術上說,非靜態的內部類包含對外部類的引用。直接反映了java如何工作。我會更新我的答案 – vsminkov

    +0

    這在Java中是非常真實的。這個問題是關於斯卡拉(也是如此)。也就是說,這不是他們不能分配的原因。 – wheaties