我有如下定义的三种 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();
}
},
;
}
(这几乎就是 Effective Java 2nd ed. Item 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 还是 eclipse 中的错误?
我已经尝试过 Sun javac 1.5.0_19 和 1.6.0_16
最佳答案
这会不会是 Bug 6522780 ?
或者 Bug 6330385 ?
或者 Bug 6724345 - 已在 JDK 7 中修复 - 因此您可以对其进行测试。
关于javac 提示 : cannot find symbol on enum implementing interface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1508632/