-
Bug
-
Resolution: Fixed
-
P4
-
8-pool, 11, 14, 15, 16
-
b21
-
x86_64
-
generic
-
Not verified
Issue | Fix Version | Assignee | Priority | Status | Resolution | Resolved In Build |
---|---|---|---|---|---|---|
JDK-8257829 | 16 | Maurizio Cimadamore | P4 | Resolved | Fixed | b28 |
A DESCRIPTION OF THE PROBLEM :
No deprecation warning is emitted when compiling a class that calls a deprecated constructor when using the diamond syntax to specify the generic types. A deprecation warning is emitted when calling the same constructor using an explicit type argument or a raw type.
I have confirmed this issue is present in Java 15, and has been present since at least Java 8 (I have not tested on Java 7), so it is not a new issue.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Create a generic class with a deprecated constructor, and another class that calls that constructor using the diamond syntax for the new instance creation. Compile using javac. The diamond constructor usage will not show up as a deprecated usage.
If the above steps are followed using an explicit type argument or raw generics, a deprecation warning will be emitted as expected.
new GenericClass<Object>(); // Warning
new GenericClass<>(); // No warning
new GenericClass(); // Warning
Include the provided Example & GenericClass source code in separate Example.java & GenericClass.java files in the same directory. Run javac against it with the "-Xlint:deprecation" option. The diamond usage will not be included as a warning.
javac -Xlint:deprecation Example.java
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The diamond constructor should show up as a deprecation warning.
ACTUAL -
No deprecation warning is emitted for the diamond constructor, but is shown for the non-diamond usages of the same constructor. The deprecation is not shown regardless of whether the "-Xlint:deprecation" command line option is used.
Example.java:3: warning: [deprecation] GenericClass() in GenericClass has been deprecated
GenericClass<Object> o1 = new GenericClass<Object>(); // Warning
^
Example.java:5: warning: [deprecation] GenericClass() in GenericClass has been deprecated
GenericClass<Object> o3 = new GenericClass(); // Warning
^
Note: Example.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
2 warnings
---------- BEGIN SOURCE ----------
public class Example {
public static void main(String[] args) {
GenericClass<Object> o1 = new GenericClass<Object>(); // Warning
GenericClass<Object> o2 = new GenericClass<>(); // No warning
GenericClass<Object> o3 = new GenericClass(); // Warning
}
}
public class GenericClass<T> {
@Deprecated
public GenericClass() {}
}
---------- END SOURCE ----------
FREQUENCY : always
No deprecation warning is emitted when compiling a class that calls a deprecated constructor when using the diamond syntax to specify the generic types. A deprecation warning is emitted when calling the same constructor using an explicit type argument or a raw type.
I have confirmed this issue is present in Java 15, and has been present since at least Java 8 (I have not tested on Java 7), so it is not a new issue.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Create a generic class with a deprecated constructor, and another class that calls that constructor using the diamond syntax for the new instance creation. Compile using javac. The diamond constructor usage will not show up as a deprecated usage.
If the above steps are followed using an explicit type argument or raw generics, a deprecation warning will be emitted as expected.
new GenericClass<Object>(); // Warning
new GenericClass<>(); // No warning
new GenericClass(); // Warning
Include the provided Example & GenericClass source code in separate Example.java & GenericClass.java files in the same directory. Run javac against it with the "-Xlint:deprecation" option. The diamond usage will not be included as a warning.
javac -Xlint:deprecation Example.java
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The diamond constructor should show up as a deprecation warning.
ACTUAL -
No deprecation warning is emitted for the diamond constructor, but is shown for the non-diamond usages of the same constructor. The deprecation is not shown regardless of whether the "-Xlint:deprecation" command line option is used.
Example.java:3: warning: [deprecation] GenericClass() in GenericClass has been deprecated
GenericClass<Object> o1 = new GenericClass<Object>(); // Warning
^
Example.java:5: warning: [deprecation] GenericClass() in GenericClass has been deprecated
GenericClass<Object> o3 = new GenericClass(); // Warning
^
Note: Example.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
2 warnings
---------- BEGIN SOURCE ----------
public class Example {
public static void main(String[] args) {
GenericClass<Object> o1 = new GenericClass<Object>(); // Warning
GenericClass<Object> o2 = new GenericClass<>(); // No warning
GenericClass<Object> o3 = new GenericClass(); // Warning
}
}
public class GenericClass<T> {
@Deprecated
public GenericClass() {}
}
---------- END SOURCE ----------
FREQUENCY : always
- backported by
-
JDK-8257829 No javac warning when calling deprecated constructor with diamond
-
- Resolved
-