2013-06-05 3 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

Общественности API MyClass1 использует часть своего частного API (MyClass1Internal). Это плохо, поскольку другой класс не знает MyClass1Internal и, следовательно, не может понять тип возврата method1.

Если вы не хотите выставлять MyClass1Internal, но при этом возвратите экземпляр к нему, вам придется преобразовать тип возврата method1 в нечто публичное. Например:

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") 
    } 
} 

Это позволяет скрыть точную реализацию интерфейса в вашем классе, но сохранить этот метод открытым. (Конечно, ваш интерфейс может быть частью класса, если вы этого хотите).

Смежные вопросы