相关疑难解决方法(0)

如何序列化lambda?

我怎样才能优雅地序列化lambda?

例如,下面的代码抛出一个NotSerializableException.如何在不创建SerializableRunnable"虚拟"界面的情况下修复它?

public static void main(String[] args) throws Exception {
    File file = Files.createTempFile("lambda", "ser").toFile();
    try (ObjectOutput oo = new ObjectOutputStream(new FileOutputStream(file))) {
        Runnable r = () -> System.out.println("Can I be serialized?");
        oo.writeObject(r);
    }

    try (ObjectInput oi = new ObjectInputStream(new FileInputStream(file))) {
        Runnable  r = (Runnable) oi.readObject();
        r.run();
    }
}
Run Code Online (Sandbox Code Playgroud)

java lambda serialization java-8

152
推荐指数
4
解决办法
4万
查看次数

使用&的Strange Java强制语法

(实际上,这个问题与lambdas没有直接关系,但是对于使用边界的强制转换,所以标记为重复的问题并没有提供这个问题的答案.你会在这里找到我的问题的答案:我应该如何为Java转换具有多个边界的泛型?)

就在最近,我参加了SW工艺会议.在其中一个讨论的例子中,我遇到了一些这样的演员,它似乎是自Java 8以来的有效Java.

Object aTest = (String & CharSequence) "test";
Run Code Online (Sandbox Code Playgroud)

我的问题:有人可以告诉我这背后的成语以及它究竟能为我们做些什么吗?该示例的演示者无法解释它,我没有找到任何提及(我甚至不知道它的名称).

除了Oleksandr之外,我还要在这里提出另一个答案,因为这个问题已被标记为重复,因此被锁定.

与此同时,我能够构建一个(人为的)用例,只是为了明确这个想法.

假设我们有泛型方法foo(),它的唯一参数是通用的,而type参数有两个上限(反对ComparableSerializable):

public static <T extends Comparable & Serializable> void foo(T t) {
    System.out.println(t);
}
Run Code Online (Sandbox Code Playgroud)

进一步假设,我们有一个类AClass,实现ComparableSerializable

public class AClass implements Comparable, Serializable {
    @Override
    public int compareTo(Object other) {
        return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

进一步假设设计的部分,我们有一个AClass对象instance,它被分配给一个类型的变量Object:

Object instance = new AClass();
Run Code Online (Sandbox Code Playgroud)

如果,在代码的另一个地方,我们想要传递instancefoo(),并且我们不知道动态类型 …

java casting bounded-types type-bounds java-8

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

Java lambda表达式 - 显式目标类型

考虑功能接口AB extends A.是否可以创建一个实例,不仅需要实现A,还需要B在只A需要时使用lambda表达式?

例:

interface A {
    void foo();
}

interface B extends A {}

void bar(A arg) {
    System.out.println(arg instanceof B);
}

/* somewhere in a block */
    bar( () -> {} ); // Prints "false"
Run Code Online (Sandbox Code Playgroud)

我怎么打电话bar(A)打印true

我会发现这在事件侦听器中很有用,其中子接口可以指定有关侦听器的其他数据,例如,如果Listener还实现ConcurrentListener,则同时调用它.

java syntax lambda

4
推荐指数
1
解决办法
521
查看次数

Java无法使用Comparators序列化包含TreeMaps的对象

我有一个相当大的项目(大学的OOP课程):一个学校注册,学生可以看到他们的成绩,教师可以增加成绩等等.

"base"类是一个包含所有使用的类(Java)的单例,例如用户数组,类(如在学校类中)和将classess和教师关联到课程的TreeMap.

我想序列化这个基类(Central),以便保存修改后的数据.问题是我得到了这个例外

java.io.NotSerializableException: liceu.Central$1
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547)
at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:440)
at java.util.TreeMap.writeObject(TreeMap.java:2265)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1495)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
at liceu.Main.main(Main.java:31)
Run Code Online (Sandbox Code Playgroud)

我的所有类都实现了Serializable,它们没有瞬态或静态字段(单例除外,它具有实例变量和getInstance方法作为静态).

因为发布会有很多代码(我会冒着通过在提交之前发布它来使我的作业无效),我试图通过尝试隔离错误来进行概念验证.

public class Central implements Serializable
{
    private ArrayList <User> users;
    private ArrayList <Class> classess;
    private TreeMap <Course, TreeMap <Class, Professor>> reunite;
    private static Central instance = null;

    private Central()
    {
        users = new ArrayList<>();
        classess = …
Run Code Online (Sandbox Code Playgroud)

java serialization exception treemap notserializableexception

2
推荐指数
2
解决办法
5640
查看次数