为什么不可能使用不同的类型参数多次实现泛型接口?
我有一个接口:
public static interface Consumer<T> {
void consume(T t);
}
我希望能够拥有:
public static class Foo implements Consumer<String>, Consumer<Integer> {
public void consume(String t) {..}
public void consume(Integer i) {..}
}
它不起作用 - 编译器不允许您实现相同的接口两次。
问题是:为什么?
人们在这里问过类似的问题,但答案总是“类型擦除”,即你不能这样做,因为类型在运行时被擦除。
它们不是 - 某些类型在运行时保留。在这种特殊情况下,它们被保留:
public static void main(String[] args) throws Exception {
ParameterizedType type = (ParameterizedType) Foo.class.getGenericInterfaces()[0];
System.out.println(type.getActualTypeArguments()[0]);
}
这打印(如果我只是为了编译而保留)class java.lang.String
Consumer<String>
因此,在最简单的解释中,擦除不是原因,或者至少它需要详细说明 - 类型就在那里,而且,您不关心类型解析,因为您已经有两个具有不同签名的方法。或者至少看起来是这样。