代码之家  ›  专栏  ›  技术社区  ›  amarillion

javac抱怨:在枚举实现接口上找不到符号

  •  15
  • amarillion  · 技术社区  · 15 年前

    我有三个Java类型,如下所定义:

    Main.java:

    import java.util.Arrays;
    import java.util.List;
    
    public class Main 
    {
        private Object callFunction() 
        {
            OperationDefinitions func = OperationDefinitions.CONCATENATE;
            List<Object> values = Arrays.asList(new Object[] {"ABC", "-", "DEF"});
            return func.call (values);
        }
    
        public static void main (String[] args)
        {
            Main main = new Main(); 
            System.out.println (main.callFunction());
        }
    }
    

    操作程序

    import java.util.List;
    
    public interface Operation
    {
        abstract Object call(List<Object> params);
    }
    

    操作定义.java

    import java.util.List;
    
    enum OperationDefinitions implements Operation
    {
        CONCATENATE() {
            public Object call(List<Object> params) 
            {
                StringBuilder builder = new StringBuilder();
                for (Object param : params) builder.append((String)param);
                return builder.toString();
            }
        },
        ;
    
    }
    

    (这几乎就是有效Java第二ED项目30中给出的例子) 上面的代码在Eclipse中编译并运行得很好,但是使用Sun Javac,我会得到以下错误:

    Main.java:12: cannot find symbol
    symbol  : method call(java.util.List<java.lang.Object>)
    location: class OperationDefinitions
            return func.call (values);
                               ^
    1 error
    

    如果我将main.java的第12行从 return func.call(values); return ((Operation)func).call(values) 它编译得很好。此外,如果我将三种类型(operation、main和operationdefinitions)放在一起作为一个主类的三个子类,那么它也可以编译。

    所以我确实有解决问题的方法,但我想知道,为什么javac需要在这里进行强制转换,而eclipse不需要?这是javac中的bug还是eclipse中的bug?

    我试过Sun Javac 1.5.0_19和1.6.0_16

    4 回复  |  直到 11 年前
        1
  •  14
  •   Stephen Denne    15 年前

    这会是 Bug 6522780 ?
    Bug 6330385 ?
    Bug 6724345 -在JDK7中修复了这个问题,所以您可以测试它。

        2
  •  10
  •   Aaron Digulla    15 年前

    这可能是Sun的javac中的一个bug。 func 是一个 enum (即使) 枚举 器具 Operation ) Enum 类没有方法 call() .为了解决这个问题,我建议修改作业:

    Operation func = OperationDefinitions.CONCATENATE;
    

    这也将清楚地表明您所期望的:一个操作,而不是 枚举 . 这个 枚举 只是收集所有可能操作的一种方便方法(如果愿意,可以使用容器)。

        3
  •  2
  •   Math user2900037    11 年前

    这是一个bug,正如“斯蒂芬·丹尼”告诉我们的,但是如果你不能更新到新版本(但应该这样做)。把内表面从 OperationDefinitions 然后把方法 ...call(...) 在枚举中,如下所示:

    public abstract Object call(List params);

    应该工作。

        4
  •  0
  •   Andrzej Doyle    15 年前

    我怀疑这实际上是 javac ; OperationDefinitions 一定地 有一个(抽象的)方法调用(java. U.L.List),因为它实现了 Operation 接口。类定义是有效的,因为所有常量都提供了这个接口的具体实现。

    有一件事可能要对此负部分责任,据我所知,接口中定义的所有方法都必须是公共的。如果你真的定义了 call 方法在带有默认访问修饰符的接口中,我希望编译器拒绝它——但是如果它不拒绝,那么看到问题就不会让我感到惊讶了。如果这是一个打字错误,那么很好,但是如果在您的代码中是这样,那么尝试将其声明为公共的,看看问题是否消失。