小编Wil*_*son的帖子

然而,非捕获lambda似乎捕获了封闭的实例

我写了这段代码:

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语言规范所期望的,如果是的话,为什么会这样?

java lambda language-lawyer java-8

13
推荐指数
1
解决办法
390
查看次数

在具有公共构造函数而不是受保护构造函数的抽象类中是否有任何意义?

由于抽象类无法实例化,并且由于受保护的成员始终对子类可见,因此它的构造函数是公共的还是受保护的似乎没有区别.

有没有公​​共构造函数与受保护构造函数相比可以有所作为的示例?我通常更喜欢适用的限制性最强的访问级别.

java constructor

6
推荐指数
1
解决办法
124
查看次数

令人困惑的类型关系

我最近在这个网站上看到了以下内容:

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.

java

5
推荐指数
1
解决办法
75
查看次数

标签 统计

java ×3

constructor ×1

java-8 ×1

lambda ×1

language-lawyer ×1