Consegui obter uma sobreposição de operador para minha classe, mas não consigo para String de forma alguma. Por que?
static void main(String[] args) {
String.metaClass.plus = {
r -> return "-";
}
print "left" + "right"
}
//I tried and so:
static void main(String[] args) {
String.metaClass.plus = {
r -> return "-".toString();
}
print "left".toString() + "right".toString()
}
Exemplo do compilador on-line Groovy
Atualizar.
Consegui alcançar o resultado desejado. Acabei de adicionar o tipo String ao parâmetro de função anônima.
//Old - non-working version.
String.metaClass.plus = {
r -> "-";
}
//New - working version.
String.metaClass.plus = {
String r -> "-";
}
A questão continua a mesma, por que a versão antiga não funcionou e a nova funciona? Na aula que estou assistindo, tudo funciona bem, o ChatGPT também disse que tudo deve funcionar.
Groovy já sobrecarregou
plus
(o comportamento que você está vendo).Sua versão
String.metaClass.plus = { "-" }
implica esta versão:String.metaClass.plus = { Object it -> "-" }
(por padrão, fechamentos groovy têm um único argumento padrãoit
, que é do tipoObject
(oudef
em linguagem groovy).Então agora existem dois
plus
em String e a JVM escolhe a melhor correspondência, ao chamá-la (polimorfismo no trabalho) ... que não é sua, porque éObject
mais genérica do queCharSequence
para seus argumentos de exemplo.Então você pode forçar sua versão assim:
Forçar o tipo do argumento para
String
- como você fez em seu exemplo de trabalho - torna sua função agora a escolhida, quando chamada com umString
argumento (e talvez qualquer argumento, porque Groovy pode coagir).Observação ao lado:
Fechamentos de escrita como
é extremamente enganoso para o leitor. Os argumentos geralmente são mantidos alinhados com a chave de abertura.