سؤال

Suppose I have a class Foo like so:

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

Now suppose I add this:

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

Does this mean that I cannot create a Bar<T, Object[]> since it would create two invoke() methods with "essentially" the same signature? Or would Bar.invoke() safely hide Foo.invoke() in this case (as Bar.invoke() is, runtime-wise, taking Object rather than the Object[] of Foo.invoke())?

Related to this: is forwarding Bar.invoke() to Foo.invoke() safe and fine?

هل كانت مفيدة؟

المحلول

Bar.invoke does not override Foo.invoke. If you call just bar.invoke with no arguments you'll get the foo.invoke called.

But you'll get a compile time error (reference to invoke is ambiguous) if you construct a Bar object: Bar<Object, Object[]> bar = new Bar<Object, Object[]>() and then invoke bar.invoke(new Object[]{}) because the 2 invoke methods have the same erasure at runtime.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top