我有三个Java类型,如下所定义:
Main.java:
import java.util.Arrays;
import java.util.List;
public class Main
{
private Object callFunction()
{
OperationDefinitions func = OperationDefinitions.CONCATENATE;
List 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 params);
}
操作定义.java
import java.util.List;
enum OperationDefinitions implements Operation
{
CONCATENATE() {
public Object call(List 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)
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