Java 对象参数不接受字符串

Java 对象参数不接受字符串,java,Java,我有一个签名如下的方法- public void errorNew(final int a, final String key, final Object... params); public void errorNew(final int a, final String key, final Object... params); public void errorNew(final int a, final String key, final Object[] params); 我试着把

我有一个签名如下的方法-

public void errorNew(final int a, final String key, final Object... params);
public void errorNew(final int a, final String key, final Object... params);
public void errorNew(final int a, final String key, final Object[] params);
我试着把它叫做-

errorNew(1, "a", "vb", "df");
但eclipse向我展示了一个错误-

The method errorNew(int, String, Object[]) in the type Logger is not applicable for the arguments (int, String, String, String)
你知道原因吗

当我尝试使用maven构建时,会显示以下错误-

 method errorNew in interface Logger cannot be applied to given types;
[ERROR] required: int,java.lang.String,java.lang.Object[]
[ERROR] found: int,java.lang.String,java.lang.String,java.lang.String
[ERROR] reason: actual and formal argument lists differ in length
对不起,伙计们…我的错。。。 其实问题是——

在我的LoggerImpl类中,我有方法签名-

public void errorNew(final int a, final String key, final Object... params);
public void errorNew(final int a, final String key, final Object... params);
public void errorNew(final int a, final String key, final Object[] params);
但在我的记录器界面中,我有方法签名-

public void errorNew(final int a, final String key, final Object... params);
public void errorNew(final int a, final String key, final Object... params);
public void errorNew(final int a, final String key, final Object[] params);
这造成了问题。我更改了接口方法signate以匹配impl signate,它开始工作。但我还是不知道原因。我过去认为他们两个是等价的如果有什么好的理由,请告诉我……


感谢大家抽出时间。

这是一种可变算术方法:

public void errorNew(final int a, final String key, final Object... params);
public void errorNew(final int a, final String key, final Object[] params);
这是一个固定的算术方法:

public void errorNew(final int a, final String key, final Object... params);
public void errorNew(final int a, final String key, final Object[] params);
如果实际参数的数量等于或大于
n-1
,则变量arity方法适用,其中
n
是该方法声明的参数数量。只有当参数的数量正好等于声明参数的数量()时,固定算术方法才适用


因此,区别不在字节码级别,而是在编译器阶段:当编译器必须解析方法签名时,算法会发生如上所述的变化,这取决于声明是固定的还是可变的。这就是为什么当您的
LoggerImpl
使用vararg参数实现
Logger
接口时,编译器不会抱怨,但当您在
Logger
接口的实例上调用它时,却找不到方法(方法签名在编译时静态解析,而不是在运行时动态解析,具体取决于对象的实际类型)

编译对我来说很好。对我来说也是。请提供更多的上下文。奇怪……那么为什么eclipse会显示错误……我不认为还有其他错误……情况很简单……您是否尝试过清理和重新编译所有内容?原因是您是针对接口进行编译的,但没有满足它。实现满足int而您的调用满足实现,但不满足接口。