Требуется включающий экземпляр, содержащий <моя ссылка>

93

Требуется включающий экземпляр, содержащий

Ниже приведен код. positionObj- это объект, который я пытаюсь использовать, и он дает мне указанную выше ошибку.

Непонятно почему.

package toolBox;
import toolBox.Secretary.positionObj;    

public class PositionManagement {
    public static HashMap<String, Secretary.positionObj> main(String vArg){
        positionObj newPosition=new positionObj();
    }
}
Джейсон М
источник

Ответы:

131

Вы пытаетесь использовать нестатический внутренний positionObjкласс без экземпляра, которому Secretaryон должен принадлежать.
Нестатический внутренний класс должен принадлежать экземпляру своего родительского класса.

Вероятно, вам следует перейти positionObjна обычный класс или статический внутренний класс.

В качестве альтернативы вы можете написать someSecretary.new positionObj()для создания экземпляра внутреннего класса, принадлежащего этому someSecretaryэкземпляру.

SLaks
источник
согласился, но это общее утверждение немного неясно. не могли бы вы привести пример или указать мне место, которое могло бы лучше объяснить это? спасибо
jason m
да. Я понял, пытаясь отладить, что если я сделал свой positionObj статическим, он работал (в своем классе секретаря). Я доволен и все, что теперь работает, но спасибо за указатель. Мы выясним истинную причину этой ошибки.
jason m
2
Фактическая причина ошибки в том, что вы не предоставили родительский экземпляр. Не используйте нестатические внутренние классы, если они вам действительно не нужны и вы не понимаете, как они работают . c2.com/ppr/wiki/JavaIdioms/NoPublicInnerClasses.html
SLaks
оба решения работают идеально [1 - сделать класс positionObj статическим и 2 - использовать OuterClass.new classObj ()]. спасибо
jason m
Да. Однако вам необходимо достаточно хорошо понимать свою кодовую базу, чтобы понять, какой из них правильный.
SLaks
17

Сначала создайте объект внешнего класса. В данном случае я думаю «Секретарь». Затем создайте positionObj. Как это,

Secretary x = new Secretary();
Secretary.positionObj y = x.new positionObj();
Тешан
источник
СПАСИБО! ... Я использую Java с версии 1.0 и не знал, что вы можете это сделать!
Ричард Т.
0

Правильная универсальная подпись будет

public static HashMap<String, positionObj> main(String vArg)

вам не нужно указывать positionObj, поскольку вы уже импортируете его.

Однако я почти уверен, что основной метод должен соответствовать подписи ниже. Если вы хотите, чтобы main был основным методом вашей программы, измените подпись на

 public static void main(String[] args) {...}

вы можете создать отдельный статический метод, который возвращает Map и вызывать его из main.

Обратите внимание: все классы должны начинаться с заглавной буквы, positionObj, должно быть PositionObj.

hvgotcodes
источник
эй, пропустил какой-то код. договорились о деле. класс действительно что-то возвращает, но ошибка здесь, и я не понимаю, почему.
jason m
@jason, я не думаю, что ты сможешь вернуть что-нибудь из основного.
hvgotcodes