Я написал этот код:
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.function.Supplier;
public class Main {
public static void main(String[] args) throws Exception {
new Main();
}
private Main() throws Exception {
Supplier<Thread> supplier = (Supplier<Thread> & Serializable) () -> new Thread() {};
new ObjectOutputStream(System.out).writeObject(supplier);
}
}
Если я запустил его, я получу исключение:
Exception in thread "main" java.io.NotSerializableException: Main
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1378)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at Main.<init>(Main.java:28)
Тем не менее, я понимаю, что я правильно сделал лямбда Serializable
, и я объявил это так, что он не относится к окружающему контексту, поэтому он не захватывает лямбда. Тем не менее экземпляр Main
фиксируется, и результат выражения лямбда не может быть сериализован. Я понимаю, что объявляю анонимный класс внутри лямбда, но я ожидал бы, что сам экземпляр лямбда будет его охватывающим экземпляром, а не окружающим типом Main
.
Является ли это поведение ожидаемым спецификацией языка Java и, если да, то как?