Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

283
Visualizações
¿Cuál es la diferencia entre for each y bucle for tradicional en Java en términos de sombreado?

Este es el código que tengo:

 class HelloWorld { char[] foo = {'a', 'b'}; // This will compile void foo() { for (char foo : foo) { } } // This will not compile void bar() { for (char foo = 0; foo < foo.length; foo++) { } } }

¿Cómo es que foo compila pero la bar de compilación falla con:

 Error: char cannot be dereferenced

¿Cuál es la diferencia entre las dos declaraciones de bucle que hacen que el bucle foo compile pero que la barra falle?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Podemos ver la diferencia observando la descripción de JLS§14.14.2 de cómo funciona el for mejorado cuando se maneja una matriz:

La instrucción for mejorada es equivalente a una instrucción for básica de la forma:

 T[] #a = Expression; L1: L2: ... Lm: for (int #i = 0; #i < #a.length; #i++) { {VariableModifier} TargetType Identifier = #a[#i]; Statement }

Observe cómo se declara la variable dentro del cuerpo del ciclo, no en el encabezado del ciclo. Es decir, su función foo es así:

 void foo() { { // Freestanding block for scope, though not really needed as `foo` has // nothing else in it char[] a = foo; // T[] #a = Expression; for (int i = 0; i < a.length; i++) { char foo = a[i]; // {VariableModifier} TargetType Identifier = #a[#i]; } } }

Es por eso que se sale con la suya con el sombreado en el for mejorado, y no en el for tradicional, que necesita acceder a la matriz original (para obtener su length , para obtener la entrada para i , etc.).

Más información sobre el bucle for mejorado en ¿Cómo funciona el bucle 'for each' de Java? y sus respuestas.

over 4 years ago · Santiago Trujillo Relatório

0

La especificación del lenguaje Java define los alcances de sus dos char foo de manera diferente:

El alcance de una variable local declarada en la parte ForInit de una instrucción for básica (§14.14.1) incluye todo lo siguiente:

  • Su propio inicializador
  • Cualquier declarante adicional a la derecha en la parte ForInit de la instrucción for
  • Las partes Expression y ForUpdate de la instrucción for
  • La Declaración contenida

El ámbito de una variable local declarada en la parte FormalParameter de una instrucción for mejorada (§14.14.2) es la instrucción contenida.

( JLS 8, sección 6.3 )

Eso explica perfectamente su comportamiento observado: el foo local está dentro del alcance en la cláusula de control del bucle for básico (en todas partes a la derecha de su declaración) y, por lo tanto, sombrea al otro foo allí, pero en el bucle for mejorado su alcance es solo la declaración de bucle: no está dentro del alcance en ninguna parte de la cláusula de control de bucle.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda