Uma instância envolvente que contém <minha referência> é necessária

91

Uma instância envolvente que contém é necessária

Abaixo está o código. positionObjé o objeto que estou tentando usar e está me dando o erro acima.

Não está claro por quê.

package toolBox;
import toolBox.Secretary.positionObj;    

public class PositionManagement {
    public static HashMap<String, Secretary.positionObj> main(String vArg){
        positionObj newPosition=new positionObj();
    }
}
Jason M
fonte

Respostas:

129

Você está tentando usar a positionObjclasse interna não estática sem uma instância de Secretarypara ela pertencer.
Uma classe interna não estática deve pertencer a uma instância de sua classe pai

Você provavelmente deve mudar positionObjpara uma classe normal ou uma classe interna estática.

Como alternativa, você pode escrever someSecretary.new positionObj()para criar uma instância da classe interna que pertence à someSecretaryinstância.

SLaks
fonte
concordou, mas esta afirmação geral é um pouco obscura. você poderia fornecer um exemplo ou apontar-me algum lugar que possa explicar isso melhor? obrigado
jason m
sim. Eu percebi ao tentar depurar que se eu fizesse meu positionObj para estático, ele funcionava (em sua classe Secretary). Estou feliz e tudo o que agora funciona, mas obrigado pelo ponteiro. Analisará a causa real desse erro.
jason m
2
A verdadeira causa do erro é que você não forneceu uma instância pai. Não use classes internas não estáticas, a menos que você realmente precise de uma e entenda como elas funcionam . c2.com/ppr/wiki/JavaIdioms/NoPublicInnerClasses.html
Mostra
ambas as soluções funcionam perfeitamente [1- tornando a classe positionObj estática e 2- usando OuterClass.new classObj ()]. obrigado
jason m
Sim. No entanto, você precisa entender sua base de código bem o suficiente para descobrir qual é a correta.
SLaks
16

Primeiro crie um objeto da classe Outer. Neste caso, penso "Secretário". Em seguida, crie positionObj. Como isso,

Secretary x = new Secretary();
Secretary.positionObj y = x.new positionObj();
Teshan
fonte
OBRIGADO! ... Eu uso Java desde a v 1.0 e não sabia que você poderia fazer isso!
Richard T
0

A assinatura genérica correta seria

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

você não precisa qualificar positionObj, pois já o importou.

No entanto, tenho certeza de que o método principal deve estar em conformidade com a assinatura abaixo. Se você pretende que o main seja o método principal para o seu programa, altere a assinatura para

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

você pode criar um método estático separado que retorna um Map e invoca-o de main.

Como observação, todas as classes devem começar com uma letra maiúscula, positionObj, e deve ser PositionObj.

hvgotcodes
fonte
hey, omitiu algum código. concordou sobre o caso. a classe retorna algo, mas o erro está aqui e não sei por quê.
jason m
@jason, não acho que você possa retornar nada do main.
hvgotcodes