在我的代码中,在类型为数组的情况下实现泛型方法时使用可变参数似乎很方便:
public interface Codec<D,E> {
E encode(D decoded);
D decode(E encoded);
}
public class MyCodec implements Codec<byte[], char[]> {
@Override char[] encode(byte... decoded) {...}
@Override byte[] decode(char... encoded) {...}
}
当我写这个的时候,Eclipse 显示了一个警告:
Varargs methods should only override or be overridden by other varargs methods unlike MyCodec.encode(byte...) and Codec.encode(byte[])
我应该忽略警告,还是会导致一些无法预料的问题?
最佳答案
这是特定于 Eclipse 的警告。它与泛型无关,可以用这个例子重现:
class A {
m(int[] ints) { }
}
class B extends A {
@Override
m(int... ints) { }
}
正如其他答案所指出的,varargs 纯粹是一个编译时特性,在运行时没有区别。我尝试搜索警告背后的具体原因,但没有找到任何结果。在可变参数和非可变参数之间交替方法覆盖可能被认为是不好的做法,因为它令人困惑和任意。但这是一般 - 只要调用者始终使用静态类型的 MyCodec
,您的用例似乎更合理。而不是编码以与 Codec<byte[], char[]>
交互.
不幸的是,没有办法抑制这个警告 - 即使是 @SuppressWarnings("all")
不会让它屈服。考虑到警告的模糊程度,这是不幸的。这是关于同一问题的古老对话:http://echelog.com/logs/browse/eclipse/1196982000 (滚动到 20:45:02)- 证明它比你早得多。似乎是无法抑制的 Eclipse 错误。
关于java - 使用可变参数实现泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16973801/