Varargs在Java中继承

时间:2012-09-01 08:03:01

标签: java generics inheritance variadic-functions member-hiding

假设我有一个类Foo,如此:

public class Foo<T> {
    protected T invoke(Object... args);
}

现在假设我添加了这个:

public class Bar<T, Arg> extends Foo<T> {
    public T invoke(Arg arg);
}

这是否意味着我无法创建Bar<T, Object[]>,因为它会创建两个invoke()方法,并且“基本上”具有相同的签名?或者Bar.invoke()在这种情况下会安全隐藏Foo.invoke()(因为Bar.invoke()Object,因为Object[]而不是Foo.invoke() Bar.invoke() )?

与此相关:将Foo.invoke()转发到{{1}}安全又好吗?

1 个答案:

答案 0 :(得分:1)

Bar.invoke不会覆盖Foo.invoke。如果您只调用bar.invoke而没有参数,则会调用foo.invoke

但是如果你构造一个reference to invoke is ambiguous对象:Bar然后调用Bar<Object, Object[]> bar = new Bar<Object, Object[]>(),你将得到一个编译时错误(bar.invoke(new Object[]{})),因为2个调用方法有在运行时擦除相同的内容。