找不到符号可序列化?
Posted
技术标签:
【中文标题】找不到符号可序列化?【英文标题】:cannot find symbol Serializable? 【发布时间】:2015-02-24 04:39:31 【问题描述】:为什么会这样:
package com.example;
import com.example.Foo.Bar.Baz;
import java.io.Serializable; // I did import Serializable...
public class Foo implements Serializable
public final Bar bar;
public Foo(Bar bar)
this.bar = bar == null ? new Bar(Baz.ONE) : bar;
public static class Bar implements Serializable // this is line 15, where the compiler error is pointing
public enum Baz
ONE
public final Baz baz;
public Bar(Baz baz)
this.baz = baz;
给我这个:
[ERROR] <path to file>/Foo.java:[15,44] cannot find symbol
[ERROR] symbol: class Serializable
[ERROR] location: class com.example.Foo
如果我将 Serializable 接口替换为其他类似的东西:
public interface MyMarkerInterface
然后代码编译。 (即使Cloneable
也有效!)
是什么导致了这种情况发生? IntelliJ 没有通过静态分析发现任何问题。
【问题讨论】:
【参考方案1】:不要尝试导入内部类。这导致您的编译器错误
// import com.example.Foo.Bar.Baz;
import java.io.Serializable;
public class Foo implements Serializable
public final Bar bar;
public Foo(Bar bar)
this.bar = bar == null ? new Bar(Bar.Baz.ONE) : bar;
public static class Bar implements Serializable
public enum Baz
ONE
public final Baz baz;
public Bar(Baz baz)
this.baz = baz;
【讨论】:
这并不能解释为什么Cloneable
或任何其他接口都有效
查看您的导入顺序。在导入 Serializable
之前,Bar 可以是 Serializable
(并已使用)吗? eclipse 对它们进行了重新排序。
哇哦,现在我明白为什么了。当 inteliJ/Eclipse 折叠并隐藏所有导入时,很难发现【参考方案2】:
在 java7 和 java8 中编译依赖于导入的顺序。 您的代码在 java >= 9 中工作。请参阅 https://bugs.openjdk.java.net/browse/JDK-8066856 和 https://bugs.openjdk.java.net/browse/JDK-7101822
要使其在 java7 和 java8 中编译,只需重新排序导入
【讨论】:
以上是关于找不到符号可序列化?的主要内容,如果未能解决你的问题,请参考以下文章