A DESCRIPTION OF THE PROBLEM :
If some class is a capturing class for several method references to the same method, method references with additional marker interfaces might be deserialized incorrectly.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Compile and run the given source code.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
This code should write the following to standard output:
y1 IS Marker1
y1 IS NOT Marker2
y2 IS NOT Marker1
y2 IS Marker2
ACTUAL -
Actual output is:
y1 IS Marker1
y1 IS NOT Marker2
y2 IS Marker1
y2 IS NOT Marker2
---------- BEGIN SOURCE ----------
import java.io.*;
public class Test {
public interface IFoo extends Serializable {
void foo();
}
public interface Marker1 {
}
public interface Marker2 {
}
public static void foo() {
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
Object x1 = (IFoo & Marker1) Test::foo;
Object y1 = roundtrip(x1);
Object x2 = (IFoo & Marker2) Test::foo;
Object y2 = roundtrip(x2);
check(y1, "y1");
check(y2, "y2");
}
private static void check(Object y, String name) {
if (y instanceof Marker1) {
System.out.println(name + " IS Marker1");
} else {
System.out.println(name + " IS NOT Marker1");
}
if (y instanceof Marker2) {
System.out.println(name + " IS Marker2");
} else {
System.out.println(name + " IS NOT Marker2");
}
}
private static Object roundtrip(Object x) throws IOException, ClassNotFoundException {
ByteArrayOutputStream out1 = new ByteArrayOutputStream();
new ObjectOutputStream(out1).writeObject(x);
return new ObjectInputStream(new ByteArrayInputStream(out1.toByteArray())).readObject();
}
}
---------- END SOURCE ----------
FREQUENCY : always