Suponhamos que eu tenha uma ComponentBase
turma, filha ObjectContextDecorator
e neta de ObjectContext
.
public class ComponentBase extends ObjectContextDecorator {
}
public class ObjectContextDecorator extends ObjectContext {
public void set(String objectTypePath, String characteristicName, Object value) {
//...
}
}
public class ObjectContext {
public void set(String characteristicName, Object value, boolean forced) {
//...
}
}
Os set
métodos ObjectContextDecorator
e ObjectContext
são muito semelhantes. Considere este código de exemplo:
ComponentBase base = new ComponentBase();
base.set(""OTM4E_EFFLEVEL"", ""IE1 / STD"", true);
As assinaturas dos dois métodos se encaixam na que está sendo chamada corretamente. Não consigo alterar as assinaturas dos métodos, pois esse não é o meu código.
Como o compilador sabe qual método eu pretendia chamar?
Eu sei que no IDE você pode apontar para qual método você realmente deseja chamar, mas nessa situação, estou usando um carregador de classes para carregar uma classe que possui um método que contém o código de exemplo.
java
overloading
method-signature
Gabriel Robaina
fonte
fonte
String, String, boolean
. O método mais específico será chamado. Isso tudo está no JLS."this"
)Respostas:
Ele verifica os argumentos e determina qual deles é mais específico, seguindo as regras descritas na JLS §15.2
No seu caso, a ligação:
os argumentos são
String
,String
,boolean
Que corresponde à primeira classe ( nomes de parâmetros alterados por brevidade )
A segunda classe não é chamada porque o terceiro parâmetro é um
Object
:e enquanto o valor booleano
true
puder corresponder se for autoboxado, o primeiro será mais específico. A regra que está sendo aplicada aqui é:Mas, por exemplo, se você usar o wrapper de objeto
Boolean
na assinatura:Em seguida, eles corresponderão e o compilador informará com a seguinte mensagem:
Mas esse não é o caso no seu exemplo.
fonte
Está tudo explicado no expressões de invocação do método JLS §15.2 . Ele mostra tudo sobre como o método correto para chamar é escolhido. E observe que isso nem sempre é bem sucedido.
No seu caso específico, os dois métodos são sobrecargas um do outro; portanto, aplica-se o §15.2.2 "Etapa 2 da compilação em tempo real: determine a assinatura do método" - qual sobrecarga a ser chamada é determinada no momento da compilação. Esta etapa é dividida em três fases.
Na primeira fase, o compilador tenta encontrar métodos aplicáveis sem permitir conversões de boxe. No seu caso, para chamar a sobrecarga que leva a
Object
, é necessária uma conversão de boxe para converterboolean
true
para o tipoObject
, para que a sobrecarga não seja escolhida na primeira fase.Bem, nós ter encontrado exatamente um método, por isso vamos basta escolher esse método. Não há ambiguidade.
fonte