web-dev-qa-db-fra.com

Surcharger une méthode: les deux méthodes ont le même effacement

J'ai le code suivant et cela ne fonctionne pas: l'erreur both methods have same erasure apparaît.

public class Foo<V>  {
    public static void main(String[] args)  {
    }

    public void Bar(V value)  {
    }

    public void Bar(Object value)  {
    } 
}

J'ai aussi ce code:

public class Foo<V>  {
    public static void main(String[] args)  {
    }

    public void Bar(B value)  {
    }

    public void Bar(A value)  {
    }
}

class A  {
}

class B extends A  {
}

Et ça marche. Dans le premier cas, V est un enfant de Object, tout comme dans le second cas B est un enfant de A. Alors pourquoi le premier cas entraîne une erreur, alors que le second se compile avec succès?

EDIT : Que dois-je faire pour obtenir une surcharge de méthode, sans déclencher d'erreur?

13
parsecer

Que dois-je faire pour obtenir une surcharge de méthode, sans déclencher d'erreur?

Simple: n'essayez pas de surcharger la méthode avec des paramètres avec le même effacement.

Quelques options:

  1. Donnez simplement des noms différents aux méthodes (c'est-à-dire n'essayez pas d'utiliser la surcharge)
  2. Ajoutez d'autres paramètres à l'une des surcharges, pour permettre la désambiguïsation (idéalement, ne faites cela que si vous avez réellement besoin de ces paramètres; mais il y a des exemples dans le Java API où il y a des paramètres indésirables simplement pour éviter les problèmes de surcharge).
  3. Liez la variable de type, comme suggéré par @ Kayaman :

    <V extends SomethingOtherThanObject>
    
20
Andy Turner

V n'est pas "un enfant de Object". V est un type générique illimité qui s'efface en Object, ce qui entraîne l'erreur. Si le type générique était limité, tel que <V extends Comparable<V>>, il serait effacé en Comparable et vous n'obtiendriez pas l'erreur.

6
Kayaman