Voici le code Java:
public static boolean anyEqual(Object needle, Object... haystack) { if(needle == null || haystack == null) { return false; } if(haystack.length == 0) { return false; } for(Object match : haystack) { if(match != null && needle.getClass() == match.getClass() && needle.equals(match)) { return true; // warning from IntelliJ here, 'contract clause !null, null -> false is violated' } } return false; }
3 Réponses :
Ce message est montré car Intellij vérifie les violations de contrat de méthode. C'est une fonctionnalité relativement nouvelle, en savoir plus sur https://www.jetbrains.com/idea/ Caractéristiques / annotation_java.html p>
Donc oui, nous pouvons comprendre que c'est une fonctionnalité. Ce que nous voulons comprendre, c'est pourquoi i> cela se comporte de cette façon.
Intellij insère la formelle contrat de votre méthode pour être ceci: Qu'est-ce que cela signifie réellement: p> Le premier contrat spécifie que, tant que le premier paramètre est Le deuxième contrat spécifie que, si le deuxième paramètre est mon intestin me dit que Intellij a du mal à discerner ce que le contrat formel de la boucle est en plus de tout ce qui précède, bien que ce soit aussi simple qu'une autre condition dans l'expression contractuelle. p> passons brièvement à travers cela. p>
null code>, il retournera
false code>. Ceci est observé par votre premier
si code> instruction: p>
for(Object match : haystack) {
if(match != null && needle.getClass() == match.getClass() && needle.equals(match)) {
return true;
}
}
null code>, il retournera
false code>. Ceci est également spécifié par le même
si code> instruction ci-dessus. P> li>
ul>
Haystack code> est de longueur 0, de sorte que c'est quelque chose à prendre en compte. li>
null code>, et je ne suis pas tout à fait sûr que l'analyse statique de Intellij couvre ce morceau. Li>
aiguille code> doit être non null, il n'y a donc rien de violer le contrat à cette ligne. Li>
correspond! = null && aiguille.getclass () == match.getclass () && aiguille.equals (correspondance) code> est
vrai code> , nous retournons
true code>. Sinon, nous retournons
faux code>. Li>
ul>
Lien vers la documentation d'Annotation de contrats Intellij est cassé. version actuelle ici .
@FLAVIN: Merci, mais à l'avenir, vous pouvez suggérer une modification. J'aurais probablement approuvé celui-là.
Ceci ressemble à un bug de Intellij pour moi, car en supprimant le mot clé Static code> de la méthode, l'avertissement disparaît. P>
Quelque chose doit dérouter l'analyse statique ici. On peut toujours soumettre ceci à Youtirk afin que Jetbrains Devs puisse le regarder. P>
Quelqu'un a déjà signalé ce numéro ici P>
(Testé sur V14.0.3) P>
Ou changez le type de retour Boolean et renvoyez Boolean.True, il ira aussi bien.
Y a-t-il une annotation au-dessus de la méthode?
Ressemble à Youtrack.JetBrains.com/issue/idea-136079 , corrigé dans 14.1 EAP chez confluence.jetbrains.com/display/idedev/idea+14.1++_ a>