ama*_*ion 15 java enums casting interface javac
我有三种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());
}
}
Run Code Online (Sandbox Code Playgroud)
Operation.java
import java.util.List;
public interface Operation
{
abstract Object call(List<Object> params);
}
Run Code Online (Sandbox Code Playgroud)
OperationDefinitions.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();
}
},
;
}
Run Code Online (Sandbox Code Playgroud)
(这几乎就是Effective Java 2nd 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
Run Code Online (Sandbox Code Playgroud)
如果我将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
Aar*_*lla 10
它可能是Sun的javac中的一个错误.func是一个enum(即使enum实现Operation)并且Enum该类没有方法call().要解决这个问题,我建议更改作业:
Operation func = OperationDefinitions.CONCATENATE;
Run Code Online (Sandbox Code Playgroud)
这也将明确你的期望:一个操作,而不是一个enum.这enum只是收集所有可能操作的便捷方式(如果您愿意,可以使用容器).