Java: resolução em tempo de compilação e “método mais específico”, como se aplica à variável arity

Alguém poderia me ajudar a entender seção 15.12.2.5 do JLS re: método mais específico?

(recortar e colar espancado da JLS a seguir)

Além disso, um método de membro de variável arity chamado m é mais específico que outro método de membro de variável arity com o mesmo nome, s

Um método membro possui n parâmetros e o outro possui k parâmetros, em que n> = k. Os tipos dos parâmetros do método do primeiro membro são T1,. . . , Tn-1, Tn [], os tipos dos parâmetros do outro método são U1,. . . , Reino Unido-1, Reino Unido []. Se o segundo método for genérico, então R1 ... Rp p1, seja seus parâmetros de tipo formal, Bl seja o limite declarado de Rl, 1lp, seja A1 ... Ap os argumentos de tipo reais inferidos (§15.12.2.7) para esta invocação sob as restrições iniciais Ti << Ui, 1ik-1, Ti << Reino Unido, parentes e deixe Si = Ui [R1 = A1, ..., Rp = Ap] 1ik; caso contrário, deixe Si = Ui, 1ik. Então: para todos os j de 1 a k-1, Tj <: Sj, e, para todos os j de k até n, Tj <: Sk e, Se o segundo método for um método genérico, conforme descrito acima, então Al <: Bl [R1 = A1, ..., Rp = Ap], 1lp.Um método membro possui k parâmetros e o outro n parâmetros, onde n> = k. Os tipos dos parâmetros do primeiro método são U1,. . . , Uk-1, Uk [], os tipos de parâmetros do outro método são T1,. . ., Tn-1, Tn []. Se o segundo método for genérico, então R1 ... Rp p1, seja seus parâmetros de tipo formal, Bl seja o limite declarado de Rl, 1lp, seja A1 ... Ap os argumentos de tipo reais inferidos (§15.12.2.7) para esta invocação sob as restrições iniciais Ui << Ti, 1ik-1, Uk << Ti, parentes e deixe Si = Ti [R1 = A1, ..., Rp = Ap] 1in; caso contrário, deixe Si = Ti, 1 pol. Então: para todos os j de 1 a k-1, Uj <: Sj, e, para todos os j de k até n, Uk <: Sj e, Se o segundo método for um método genérico como descrito acima, então Al <: Bl [R1 = A1, ..., Rp = Ap], 1lp.

Ignorar os genéricos do problema, isso significa que as varargs são mais importantes que a subtipagem ou a subtipagem é mais importante que as varargs, ao decidir se um método é mais específico que o outro? Não consigo entende

Exemplo de concreto: Qual dos seguintescompute() métodos é "mais específico" de acordo com o JL

package com.example.test.reflect;

class JLS15Test
{
    int compute(Object o1, Object o2, Object... others) { return 1; }
    int compute(String s1, Object... others)            { return 2; }

    public static void main(String[] args) 
    {
        JLS15Test y = new JLS15Test();
        System.out.println(y.compute(y,y,y));
        System.out.println(y.compute("hi",y,y));
    }
}

Não consigo descobrir qual é "mais específico"; a saída imprime

1
2

Estou confuso sobre como interpretar os resultados. Quando o primeiro argumento foi uma String, o compilador escolheu o método com o subtipo mais específico. Quando o primeiro argumento foi um Objeto, o compilador escolheu o método com o menor número de variáveis opcionai

NOT: Se você não está lendo esta seção do JLS e está dando uma resposta que depende dos tipos de argumentos, você não está me ajudando. Se você ler atentamente o JLS, além das partes relacionadas aos genéricos, a definição de "mais específico" depende dos argumentos declarados, não dos argumentos reais - isso entra em jogo em outras partes do JLS (não é possível encontrá-lo no momento

por exemplo. para métodos de aridade fixa,compute(String s) seria mais específico quecompute(Object o). Mas estou tentando entender a seção relevante dos métodos de aridade variável JLS r

questionAnswers(3)

yourAnswerToTheQuestion