Supongamos que tiene una clase parametrizada con un constructor en desuso y una clase User que llama a este constructor. En el siguiente ejemplo, usando el operador de diamante, javac (versión 11.0.11) no produce una advertencia de obsolescencia:
class DepTester<T> { T t; @Deprecated public DepTester(T t) { this.t = t; } } class User { DepTester<String> tester = new DepTester<>("This does not produce a warning!"); }Sin embargo, con un argumento de tipo explícito en la llamada al constructor, se emite la advertencia:
class User { DepTester<String> tester = new DepTester<String>("This produces a warning."); } [WARNING] DepTester.java:[17,40] DepTester(T) in com.foo.DepTester has been deprecatedEl argumento de tipo explícito normalmente no se incluye, sobre lo cual la inspección de IntelliJ también advierte:
Argumento de tipo explícito La cadena se puede reemplazar con <>
No puedo encontrar una explicación para este comportamiento en la especificación del lenguaje Java . Probé con javac 17, y produce una advertencia en ambos casos, ¿es esto un error en javac 11?
EDITAR: A mi informe de errores para Oracle se le asignó un ID en la base de datos de errores de Java: JDK-8281107
Encontró el error JDK-8257037 , "No hay advertencia de javac al llamar al constructor obsoleto con diamante":
No se emite ninguna advertencia de desaprobación cuando se compila una clase que llama a un constructor obsoleto cuando se usa la sintaxis de diamante para especificar los tipos genéricos. Se emite una advertencia de desaprobación cuando se llama al mismo constructor usando un argumento de tipo explícito o un tipo sin procesar.
Se ha solucionado con JDK 17.
También hay un backport informado para JDK 16 , pero ninguno para versiones anteriores.