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();
    }
}

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.


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();

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.