0

I have the next class:

public class Matrix implements ITensor {

    public double get(int row, int column) {
        return mData[row][column];
    }

    @Override
    public double get(int... indices) {
        return get(indices[0], indices[1]);
    }
}

So get(r, c) suits for both signatures, will Java call the first declaration (I can check, of course, I mean if it's a standard behavior)? How does JVM chooses a method signature in this case?

P.S. Seems it's a noobie's question but I can't find information myself

Denis Sologub
  • 7,277
  • 11
  • 56
  • 123

1 Answers1

2

TL;DR A varargs method will never be chosen over a non-varargs method.

See JLS 15.12.2. Compile-Time Step 2: Determine Method Signature:

The process of determining applicability begins by determining the potentially applicable methods (§15.12.2.1). Then, to ensure compatibility with the Java programming language prior to Java SE 5.0, the process continues in three phases:

  1. The first phase performs overload resolution without permitting boxing or unboxing conversion, or the use of variable arity method invocation. If no applicable method is found during this phase then processing continues to the second phase.

    This guarantees that any calls that were valid in the Java programming language before Java SE 5.0 are not considered ambiguous as the result of the introduction of variable arity methods, implicit boxing and/or unboxing. However, the declaration of a variable arity method (§8.4.1) can change the method chosen for a given method method invocation expression, because a variable arity method is treated as a fixed arity method in the first phase. For example, declaring m(Object...) in a class which already declares m(Object) causes m(Object) to no longer be chosen for some invocation expressions (such as m(null)), as m(Object[]) is more specific.

  2. The second phase performs overload resolution while allowing boxing and unboxing, but still precludes the use of variable arity method invocation. If no applicable method is found during this phase then processing continues to the third phase.

    This ensures that a method is never chosen through variable arity method invocation if it is applicable through fixed arity method invocation.

  3. The third phase allows overloading to be combined with variable arity methods, boxing, and unboxing.

Community
  • 1
  • 1
Andreas
  • 154,647
  • 11
  • 152
  • 247