Java: la suppression de “Comparable est une crue de type” avertissement
Supposons que j'ai une méthode appelée foo prendre 2 Objet comme paramètre. Les deux objets sont de même type et de même les deux implémente l'interface comparable.
void foo(Object first, Object second){
if (!first.getClass().isInstance(second)) //first and second of the same type
return;
Comparable firstComparable = (Comparable)first; //WARNING
Comparable secondComparable = (Comparable)second; //WARNING
int diff = firstComparable.compareTo(secondComparable); //WARNING
}
Les 2 premières avertissement:
Comparables est une crue de type. Références de type générique Comparable
doit être paramétrée
La dernière mise en garde:
Type de sécurité: La méthode compareTo(Object) appartient à la crue de type
Comparables. Références de type générique Comparable devrait être
paramétrable
Comment pourrais-je refactoriser mon code afin de supprimer ces avertissements?
EDIT:
Puis-je le faire sans changer de foo signature de la méthode?
prenez pas de changement de la fonction du paramètre de l'objet de comparable ?
provoquer le même Avertissement
voulez-vous vous débarrasser de l'avertissement ? Même si vous utilisez des médicaments génériques néanmoins, il n'est qu'un sucre syntaxique et le casting aura de toute façon lieu.Pourquoi ne pas tout simplement supprimer les avertissements ?
c'était juste de la curiosité. Même avec l'avertissement que le code fonctionne très bien.
provoquer le même Avertissement
Comparable is a raw type
voulez-vous vous débarrasser de l'avertissement ? Même si vous utilisez des médicaments génériques néanmoins, il n'est qu'un sucre syntaxique et le casting aura de toute façon lieu.Pourquoi ne pas tout simplement supprimer les avertissements ?
c'était juste de la curiosité. Même avec l'avertissement que le code fonctionne très bien.
OriginalL'auteur Heisenbug | 2011-08-10
Vous devez vous connecter pour publier un commentaire.
Vous devez indiquer au compilateur qu'ils sont du même type et comparables. Si vous ne pouvez pas changer la signature que vous pouvez ajouter une méthode pour la compatibilité descendante.
Vous devez avoir une certaine manière de dire au compilateur quel type de la première et de la deuxième. Vous ne pouvez pas modifier ce sans modifier la signature. Si vous ne pouvez pas changer la signature que vous pouvez utiliser plus d'une méthode
Ok..je l'obtenir. merci pour la réponse..de toute façon semble ce n'est pas possible de faire ce que je veux avec aucun avertissement.
Les avertissements sont attendus comme le compilateur ne peut pas déterminer si le casting vous faites, c'est sûr. Vous seul pouvez dire qu'il est en sécurité à l'aide de la signature à droite.
OriginalL'auteur Peter Lawrey
Sans changeing de Signature que vous pouvez faire
Mais vous avez toujours :
Type safety: Unchecked cast from Object to Comparable<Object>
mais pas
Comparable is a raw type. References to generic type Comparable<T> should be parameterized
et pas de
Type safety: The method compareTo(Object) belongs to the raw type Comparable. References to generic type Comparable<T> should be parameterized
if(Comparable.class.isAssignableFrom( first.getClass() ))
OriginalL'auteur oliholz
Que vous avez à faire usage
Comparable<Type>
où Type est l'objet qui est la mise en œuvre deComparable
.Tout d'abord, pourquoi vos paramètres de méthode d'instance de
Objects
? Si vous êtes sûr que les types de paramètres sont les mêmes, vous devez utiliser la classe spécifique en tant que paramètre. Si vous pouvez avoir une hiérarchie de classes, la classe la plus élevée dans la hiérarchie. AyantObject
pour réaliser la fonctionnalité générale n'est jamais une bonne idée.Vous devez modifier votre signature de la méthode comme dans @Pierre Lawrey de réponse, ou de vivre avec l'avertissement...
OriginalL'auteur Nivas
EDIT: Depuis que vous avez dit que vous ne pouvez pas changer la signature de la méthode, alors vous vraiment ne peut pas sortir sans un dangereux pour le compilateur) en fonte, et une
@SuppressWarnings
:Yup. Édité ma réponse.
OriginalL'auteur Alistair A. Israel
Ajouter @SuppressWarnings annotation.
OriginalL'auteur Ondrej Sotolar