【发布时间】:2018-09-18 22:51:12
【问题描述】:
我知道we can cast a function 是我们需要的Serializable。
但是,我想将此转换移动到一个 generic 方法,以使使用代码不那么混乱。 我没有设法创建这样的方法。
我的具体问题是下面的地图不是Serializable:
final Map<MyObject, String> map =
new TreeMap<>(Comparator.comparing(MyObject::getCode));
我可以使用以下方法解决此问题:
final Map<MyObject, String> map =
new TreeMap<>(Comparator.comparing((Function<MyObject, String> & Serializable) MyObject::getCode));
但我希望能够做类似的事情:
final Map<MyObject, String> map =
new TreeMap<>(Comparator.comparing(makeSerializable(MyObject::getCode)));
public static <T, U> Function<T, U> makeSerializable(Function<T, U> function) {
return (Function<T, U> & Serializable) function;
}
对于编译器来说这很好,但在运行时,我得到一个ClassCastException:
java.lang.ClassCastException: SerializableTest$$Lambda$1/801197928 cannot be cast to java.io.Serializable
我还尝试了以下替代方法,但均未成功:
// ClassCastException
public static <T extends Serializable, U extends Serializable> Function<T, U> makeSerializable(Function<T, U> function) {
return (Function<T, U> & Serializable) function;
}
// No ClassCastException, but NotSerializableException upon Serializing
public static <T, U> Function<T, U> makeSerializable2(Function<T, U> function) {
return (Function<T, U> & Serializable) t -> function.apply(t);
}
是否可以创建这样的方法?
MyObject的实现:
static class MyObject implements Serializable {
private final String code;
MyObject(String code) {
this.code = code;
}
public String getCode() {
return code;
}
}
【问题讨论】:
-
您能否添加您的测试用例(或MCVE)以便我们测试潜在的解决方案?
-
@JacobG。他已经做到了……
-
@Eugene 在哪里?我没有看到可以序列化问题中任何内容的代码。具体来说,我想看看他是如何序列化他的对象的。
-
@JacobG。我的错 - 它在现已删除的答案中
new ObjectOutputStream(new ByteArrayOutputStream()).writeObject(map); -
@Eugene 哦,谢谢!我需要更快地达到 10k,这样我才能看到!
标签: java generics lambda java-8 comparator