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

2022-09-03 12:58:56

我有三种java类型,定义如下:

主要.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());
    }
}

操作.java

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》第2版第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 的第 12 行.java从更改为它编译正常。此外,如果我把三种类型(Operation,Main和OperationDefinitions)放在一起作为单个main类的三个子类,那么它的编译也很好。return func.call(values);return ((Operation)func).call(values)

因此,我确实为我的问题提供了解决方法,但我确实想知道,为什么javac在这里需要强制转换,而eclipse则不需要?这是javac中的错误还是日食中的错误?

我尝试了Sun javac 1.5.0_19和1.6.0_16


答案 1

这可能是错误6522780吗?
还是虫子6330385
或者 Bug 6724345 - 在 JDK 7 中修复 - 所以你可以测试它。


答案 2

这可能是Sun的javac中的一个错误。 是一个(即使它实现了),并且该类没有方法。为了解决这个问题,我建议改变分配:funcenumenumOperationEnumcall()

Operation func = OperationDefinitions.CONCATENATE;

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