【问题标题】:Varargs with inheritance in JavaJava中具有继承的可变参数
【发布时间】:2012-08-26 21:40:12
【问题描述】:

假设我有这样的课程Foo

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

现在假设我添加这个:

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

这是否意味着我无法创建Bar&lt;T, Object[]&gt;,因为它会创建两个“基本上”具有相同签名的invoke() 方法?或者Bar.invoke() 在这种情况下会安全地隐藏Foo.invoke()(因为Bar.invoke() 在运行时采用Object 而不是Foo.invoke()Object[])?

与此相关:将Bar.invoke() 转发到Foo.invoke() 安全吗?

【问题讨论】:

  • 您要解决什么问题?这看起来比任何 SCJP 问题都难。

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


【解决方案1】:

Bar.invoke 不会覆盖Foo.invoke。如果您只调用 bar.invoke 而不使用任何参数,您将调用 foo.invoke

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

【讨论】:

    猜你喜欢
    • 2019-04-25
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 2011-08-09
    • 2011-01-09
    相关资源
    最近更新 更多