Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

271
Views
¿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?

about 4 years ago · Santiago Trujillo
2 answers
Answer question

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.

about 4 years ago · Santiago Trujillo Report

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.

about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!