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