2013-06-05 117 views
1

有一個錯誤,我不明白:返回一個嵌套類從方法

class MyClass1 { 
    private class MyClass1Internal(a: Int, b: Int, c: String, d: String) 
    def method1 = { 
    // doing something 
    new MyClass1Internal(1, 2, "3", "4") 
    } 
} 

錯誤

private class MyClass1Internal escapes its defining scope as part of type MyClass1.this.MyClass1Internal 
[error] def method1 = { 
[error]  ^

它是什麼,我如何擺脫它?

回答

6

MyClass1Internal是私有的,因此應該永遠無法的MyClass1外面訪問,但是method將返回它的實例,這個類外(因爲它是公共的),從而打破其定義的範圍。

我敢打賭,如果您將method定義爲私有,它會修復此錯誤。你也可以使嵌套類不是私有的。

還有一件事,如果你想要其他代碼能夠與一流的工作,但不能夠實例化,那麼就使構造私人和班公像這樣:

class MyClass1 { 
    class MyClass1Internal private[MyClass1](a: Int, b: Int, c: String, d: String) 
    def method1 = { 
    // doing something 
    new MyClass1Internal(1, 2, "3", "4") 
    } 
} 
+0

我不能把它變成私人的,我需要它是公開的。 –

+0

那麼你不能做你想做的事情。這個內部階層是私人的。它不應該在包含類之外訪問。你也可以讓內部類不是私人的。不知道你是否可以做到這一點雖然 – cmbaxter

+0

我可以問爲什麼你想這個類是私人的。如果我可以更好地理解這個問題,也許有更好的解決方案 – cmbaxter

1

公衆MyClass1的API使用其私有API的一部分(MyClass1Internal)。這很糟糕,因爲另一個班級不知道MyClass1Internal,因此無法理解返回類型method1

如果你不想公開MyClass1Internal但仍然返回一個實例,你必須將method1的返回類型上傳到public。例如:

trait MyClass1Interface { 
    def a: Int 
} 

class MyClass1 { 
    private class MyClass1Internal(val a: Int, b: Int, c: String, d: String) 
    extends MyClass1Interface 
    def method1: MyClass1Interface = { 
    // doing something 
    new MyClass1Internal(1, 2, "3", "4") 
    } 
} 

這使您可以隱藏類中接口的確切實現,但保持公開方法。 (如果你喜歡,你的界面當然仍然可以是班級的一部分)。