2012-09-18 10 views
6

Duplicar posible:
@SuppressWarnings for “extends String”¿Por qué `T extends String` está permitido pero da advertencia?

Por qué T extends String está permitido, pero da la advertencia?

El parámetro tipo T no debe estar delimitado por el tipo final String. tipos finales no pueden extenderse más

public class Car<T extends String> 

sé lo que es final Sé que es válida porque sólo es posible valor de T can be String me preguntaba acerca de advertencia.

+2

El mensaje de advertencia lo dice todo. ¿Cómo se puede crear una clase que extienda la cadena 'final'? Entonces 'T' definitivamente será un' String' – Raffaele

+0

@ Thor84no vea la pregunta editada y la respuesta [axtavt] (http://stackoverflow.com/a/12475147/315306) – Raffaele

Respuesta

13

Si la pregunta real es "por qué está permitido", imagine una situación en la que agregue final palabra clave a la clase existente. Creo que no desea que este cambio rompa otro código existente que utiliza esta clase como un límite genérico, porque sigue siendo perfectamente legal. Es por eso que el compilador no emite un error en este caso.

Desde el otro lado, quiere que se le informe si usa accidentalmente la clase final como límite genérico, porque tal construcción no tiene sentido. Es por eso que el compilador emite una advertencia.

En realidad, es una práctica común marcar constructos legales pero sin sentido con advertencias.

1

Porque String en java es final, i. mi. no puedes extender esa clase Tiene la advertencia porque no puede existir una clase que extienda String.

+2

OP pregunta por qué está permitido hacerlo ? –

3

Básicamente, está diciendo que solo hay un tipo posible para T y que es String. Así que, básicamente, su clase genérica Car es genérica solo por su nombre. También puede simplemente reemplazar todas las instancias de T en la clase con String.

mejor usted se refiere public class Car<T extends CharSequence> ... se permite


La construcción porque la clase es significativa, y posiblemente incluso útil. La advertencia se da porque (en opinión de los escritores del compilador) es probable que haya cometido un error. El razonamiento es el mismo que para la advertencia de que algunos compiladores le dará por lo siguiente:

String NULL = null; 
System.err.println(NULL.toString()); 

Esto es significativo, pero es un error ... a menos que la intención a una excepción.


Se me ocurren dos escenarios en los que public class Car<T extends SomeFinalClass> no es un error:

  • El caso en el que SomeFinalClass originalmente no era final.
  • El caso donde se genera automáticamente el código para Car, y sería incómodo generar código de caso especial para las clases final.
Cuestiones relacionadas