找不到符号可序列化?

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 中编译,只需重新排序导入

【讨论】:

以上是关于找不到符号可序列化?的主要内容,如果未能解决你的问题,请参考以下文章

VS2010:尝试为故障转储加载符号时“找不到匹配的二进制文件”

java 枚举 找不到符号

java package找不到符号

maven编译时候提示找不到符号怎么办

java里显示找不到符号?

找不到符号 - Spring Boot Maven 兄弟作为依赖