Pregunta

En Java dado esto:

String a = "str";
CharSequence b = "charseq";

puedes escribir

b = b + a;

pero no puedo escribir (da un error del compilador)

b += a;

El error es

incompatible types
found   : java.lang.CharSequence
required: java.lang.String

Ahora en JLS Segunda edición esto fue explicable por esta línea en 15.26.2 Operadores de asignación de compuestos:

All compound assignment operators require both operands to be of primitive type, except for +=, which allows the right-hand operand to be of any type if the left-hand operand is of type String.

Pero en la tercera edición de JLS, este comentario desapareció, lo único que se dice sobre el operador compuesto está en 15.26.2 Operadores de asignación de compuestos:

A compound assignment expression of the form E1 op= E2 is equivalent to E1 = (T)((E1) op (E2)), where T is the type of E1, except that E1 is evaluated only once.

que no parece funcionar (ver arriba).

Entonces mi pregunta es: ¿cuál es exactamente la relación entre Javac y JLS y este ejemplo particular es un error en Javac o un error en JLS?

¿Fue útil?

Solución

Error del compilador es un error en tu versión Javac. Como señalado en respuesta anterior Este error se soluciona en Java 7.

Ver EG ID de error 7058838 en la base de datos de Sun Bug:

  • descripción:

    Una función siguiente no se puede compilar en Java 1.6 o menos. pero se puede compilar en Java 1.7.

    public static void main(String[] args) {
           Object x = "x";
           String y = "y";
           x += i;
    }
    
  • estado:
    No es un defecto
  • evaluación:

    Para un objeto x y una cadena y, x+= y es solo x = (objeto) (x+y). Como y es una cadena, X sufre una conversión de cadena para producir una cadena que se concatena con y, antes del fundido no-op al objeto. El JLS no ha cambiado en esta área entre SE 6 y SE 7; El programa debería haber sido legal durante muchos años.


Para obtener fondo, ver también viejo ID de error 4741726

  • descripción:

    Javac utilizado para permitir expresiones del formulario o += s donde o es una variable de objeto de tipo y s es una expresión de cadena de tipo. Lo arreglamos recientemente (4642850) y esto causó una falla de construcción (4741702). ¿Quizás esto es lo suficientemente común como para relajar la especificación en lugar de arreglar el compilador?

  • Categoría:
    Java: compilador
  • Liberación solucionada:
    7 (B25) - Por lo que entiendo, esto significa fijo en la construcción 25 de Java 7
  • evaluación:

    Me inclino a relajar la especificación, aunque tendríamos que saber qué hacen otras implementaciones antes de hacer una llamada final sobre esto.
    2002-09-04
    JLS3 permite objeto+= cadena porque el '+' significa concatenación de cadena y eso puede concatenar un objeto con una cadena tan fácilmente como una cadena con un objeto.
    2008-01-31

Otros consejos

Debería ser un error Javac entonces.

Se compila bien en Javac 7. Entonces alguien lo informó y está arreglado.

En esencia, respondiste a tu propia pregunta:

All compound assignment operators require both operands to be of primitive type, except for +=, which allows the right-hand operand to be of any type if the left-hand operand is of type String.

Tenga en cuenta que su operando de la izquierda no tiene una cadena de tipo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top