我写了这段代码:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我运行它,我会得到一个例外:
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)
Run Code Online (Sandbox Code Playgroud)
但是,我的理解是我正确地制作了lambda Serializable
并且我声明它不会引用任何周围的上下文,因此它是一个非捕获的 lambda.然而,Main
实例被捕获并且lambda表达式的结果无法序列化.我意识到我在lambda中声明了一个匿名类,但我希望lambda实例本身是它的封闭实例,而不是周围的Main
类型.
这种行为是Java语言规范所期望的,如果是的话,为什么会这样?
由于抽象类无法实例化,并且由于受保护的成员始终对子类可见,因此它的构造函数是公共的还是受保护的似乎没有区别.
有没有公共构造函数与受保护构造函数相比可以有所作为的示例?我通常更喜欢适用的限制性最强的访问级别.
我最近在这个网站上看到了以下内容:
for (HashMap.Entry<Object,Object> e : new TreeMap<>().entrySet())
System.out.println(e);
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,这编译并运行良好.我也尝试在地图中添加条目,因此实际上有一些内容可以向下转换,但是这样做也失败了,这也很好.如何TreeMap
输入一个条目HashMap.Entry
?这两者甚至不在层次结构的同一分支上.
虽然现在已经解决了这个问题,但我将以下内容仅仅包含在内以下 - 以下内容无法编译:
for (TreeMap.Entry<Object,Object> e : new HashMap<>().entrySet())
System.out.println(e);
Run Code Online (Sandbox Code Playgroud)
碰巧TreeMap
定义TreeMap.Entry
,隐藏Map.Entry
.