Wymagana jest obejmująca instancja zawierająca <moje odwołanie>

93

Wymagana jest obejmująca instancja zawierająca

Poniżej znajduje się kod. positionObjjest obiektem, którego próbuję użyć i daje mi powyższy błąd.

Nie jest jasne, dlaczego.

package toolBox;
import toolBox.Secretary.positionObj;    

public class PositionManagement {
    public static HashMap<String, Secretary.positionObj> main(String vArg){
        positionObj newPosition=new positionObj();
    }
}
jason m
źródło

Odpowiedzi:

131

Próbujesz użyć niestatycznej positionObjklasy wewnętrznej bez instancji, Secretarydo której należałoby.
Niestatyczna klasa wewnętrzna musi należeć do wystąpienia swojej klasy nadrzędnej

Prawdopodobnie powinieneś zmienić positionObjklasę normalną lub statyczną klasę wewnętrzną.

Alternatywnie możesz napisać, someSecretary.new positionObj()aby utworzyć wystąpienie klasy wewnętrznej, która należy do someSecretaryinstancji.

SLaks
źródło
zgodził się, ale to ogólne stwierdzenie jest nieco niejasne. czy mógłbyś podać przykład lub wskazać mi miejsce, które mogłoby lepiej to wyjaśnić? dzięki
jason m
tak. Kiedy próbowałem debugować, zdałem sobie sprawę, że jeśli ustawiłem moje positionObj na statyczne, to zadziałało (w klasie sekretarza). Cieszę się i wszystko to teraz działa, ale dzięki za wskaźnik. Sprawdza rzeczywistą przyczynę tego błędu.
jason m
2
Rzeczywistą przyczyną błędu jest to, że nie podano instancji nadrzędnej. Nie używaj niestatycznych klas wewnętrznych, chyba że naprawdę ich potrzebujesz i rozumiesz, jak działają . c2.com/ppr/wiki/JavaIdioms/NoPublicInnerClasses.html
SLaks
oba rozwiązania działają doskonale [1 - uczynienie klasy positionObj statyczną i 2 - użycie OuterClass.new classObj ()]. dzięki
jason m
Tak. Jednak musisz wystarczająco dobrze zrozumieć swoją bazę kodu, aby dowiedzieć się, który z nich jest poprawny.
SLaks
17

Najpierw utwórz obiekt klasy Outer. W tym przypadku myślę „Sekretarz”. Następnie utwórz positionObj. Lubię to,

Secretary x = new Secretary();
Secretary.positionObj y = x.new positionObj();
Teshan
źródło
DZIĘKUJĘ CI! ... Używałem Javy od wersji 1.0 i nie wiedziałem, że możesz to zrobić!
Richard T
0

Prawidłowy podpis ogólny to

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

nie musisz kwalifikować pozycji PositionObj, ponieważ już ją importujesz.

Jestem jednak pewien, że główna metoda musi być zgodna z podpisem poniżej. Jeśli chcesz, aby main był główną metodą twojego programu, zmień podpis na

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

możesz utworzyć oddzielną metodę statyczną, która zwraca Map i wywołuje ją z main.

Uwaga: wszystkie klasy powinny zaczynać się wielką literą, positionObj, powinno być PositionObj.

hvgotcodes
źródło
hej, zostaw jakiś kod. zgodził się w sprawie. klasa coś zwraca, ale błąd jest tutaj i nie wiem dlaczego.
jason m
@jason, nie sądzę, że możesz zwrócić cokolwiek z pliku main.
hvgotcodes