Summary
The fix for JDK-8059632 caused a regression in method reference serialization and deserialization. Given the complex nature of the problem, the proposal is to revert the JDK-8059632 fix, and re-apply it in a future version, together with possible fixes for serialization, if and as needed.
Problem
Considering code like:
static class E {
public boolean test(Object o) { return false; }
}
static class F extends E implements Serializable {
}
...
F e = new F();
Predicate<E> p = (Serializable & Predicate<E>) e::test;
Before JDK-8059632, the classfile reference corresponding to e::test
in the source code was E::test
. That is wrong per JLS 13.1, the reference should be to F::test
, which JDK-8059632 fixed. As a consequence, however, if the value in p
is serialized, it can no longer be deserialized, even by the very same classfile and JDK.
Solution
Given the release timing, and overall complexity of fixes in (de-)serialization code for method references, the proposal is to revert the fix for JDK-8059632, evaluate the impact on serialization, and re-apply the fix with any further changes for serialization deemed necessary in a future version.
Specification
Classfile references corresponding to source code method references will revert to pre-JDK-8059632, i.e. JDK 19, form. This form does not adhere to the JLS 13.1 wording, but it is a long-standing behavior.
- csr of
-
JDK-8300623 Lambda deserialization regression involving Enum method reference
- Closed
- relates to
-
JDK-8295975 Method reference compilation uses incorrect qualifying type
- Closed