java - 使用可变参数实现泛型方法

标签 java eclipse generics variadic-functions

在我的代码中,在类型为数组的情况下实现泛型方法时使用可变参数似乎很方便:

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/

相关文章:

c# - 扩展方法,泛型 List<T> 上的 SumIf

java - Java Socket 编程场景

java - Android:AlarmManager 有时不调用 BroadcastReceiver

java - 在maven中创建模块

java - 将版权 header 添加到所有项目文件(.java、.xml、...)

eclipse - "paste"SWT 小部件上的监听器

generics - 如何获取泛型类型的实际类型?

java - 对持有整数值的 double 变量的算术运算是否准确?

java - 类型不匹配 : cannot convert from Class<RulesGenerator> to Class<? 扩展 IGenerator2> xtest 错误

Swift:与 where 约束关联的类型