Overload de método com Generics

6 respostas
danieldestro

Só para informar algo que acabei de constatar no Java 5.

Ele não permite o código abaixo. Diz que existem método duplicados. Embora eu use Generics para diferenciar o tipo dos objetos permitidos em cada lista, ele considera os métodos com a mesma assinatura.

public void a(List<String> s) {}

public void a(List<Integer> s) {}

6 Respostas

xandroalmeida

A implementação do Generics no Java faz o apagamento (Erasure) do tipo, e por isso no final os bytecodes gerados são os mesmo nos dois métodos.

aquilante

Mas isso é um erro então?
Suponhamos que eu tenha por algum motivo q implementar dessa forma, não teria como? Eu n entendi muito bem pq da esse erro, testei aqui e realmente n aceita. A única saída seria renomear as variáveis?

:?: :shock: :?: :lol:

fabim

aquilante:
Mas isso é um erro então?
Suponhamos que eu tenha por algum motivo q implementar dessa forma, não teria como? Eu n entendi muito bem pq da esse erro, testei aqui e realmente n aceita. A única saída seria renomear as variáveis?

:?: :shock: :?: :lol:

Nao e um erro. Estude a resposta do xandroalmeida e vc vai entender o pq.

xandroalmeida

aquilante:
Mas isso é um erro então?
Suponhamos que eu tenha por algum motivo q implementar dessa forma, não teria como? Eu n entendi muito bem pq da esse erro, testei aqui e realmente n aceita. A única saída seria renomear as variáveis?

:?: :shock: :?: :lol:

Não é um erro e sim uma caracteristica. :wink:

thegoergen

aquilante:
Mas isso é um erro então?
Suponhamos que eu tenha por algum motivo q implementar dessa forma, não teria como? Eu n entendi muito bem pq da esse erro, testei aqui e realmente n aceita. A única saída seria renomear as variáveis?

:?: :shock: :?: :lol:

Renomear as variáveis não irá mudar a assinatura do método !!

T

Em Scala o problema é exatamente o mesmo (se é que é um problema).

package example;

object ScalaGenerics {
  
  def a ( s : List[String] ) : Unit = {
    Console.println ("Chamado o primeiro overload");
  }
  /*
   Isto, em Scala, provoca o erro:
double definition:
method a:(List[Int])Unit and
method a:(List[String])Unit at line 4
have same type after erasure: (List)Unit        
  */
  def a ( s : List[Int] ) : Unit = {
    Console.println ("Chamado o segundo overload");
  }
  
  def main(args : Array[String]) : Unit = {
    a ( "José" :: "Aparecido" :: Nil ); // Deveria chamar o primeiro overload
    a (List.range (1, 10)); // Deve chamar o segundo overload
  }
}
Criado 27 de março de 2008
Ultima resposta 27 de mar. de 2008
Respostas 6
Participantes 6