Je pense que cela s'explique par les règles d'affectation définies par JLS pour switch
déclarations ( JLS 16.2.9 ) qui stipule ce qui suit :
"V est [non] affecté après une déclaration de commutation si toutes les conditions suivantes sont remplies :
- Soit il existe une étiquette par défaut dans le bloc de commutation, soit V est [non]attribué après l'expression de commutation.
Si nous appliquons ensuite cela à la notion de V
qui est la valeur de retour de la méthode, nous pouvons voir que s'il n'y a pas de default
la valeur serait théoriquement non attribuée.
OK ... J'extrapole les règles d'affectation définies pour couvrir les valeurs de retour, et peut-être qu'elles ne le font pas. Mais le fait que je n'ai pas pu trouver quelque chose de plus direct dans la spécification ne signifie pas qu'il n'y en a pas :-)
Il y a une autre raison (plus saine) pour laquelle le compilateur doit donner une erreur. Elle découle des règles de compatibilité binaire pour les éléments suivants enum
( JLS 13.4.26 ) qui stipulent ce qui suit :
"L'ajout ou la réorganisation des constantes d'un type d'énumération ne rompt pas la compatibilité avec les binaires préexistants."
Alors comment cela s'applique-t-il dans ce cas ? Eh bien, supposons que le compilateur était permis de déduire que l'exemple de l'instruction switch de l'OP retournait toujours quelque chose. Que se passe-t-il si le programmeur modifie maintenant l'instruction enum
pour ajouter une constante supplémentaire ? Selon les règles de compatibilité binaire de JLS, nous n'avons pas rompu la compatibilité binaire. Pourtant, la méthode contenant le switch
peut maintenant (en fonction de son argument) retourner une valeur non définie. C'est ne peut pas être autorisé à se produire, et donc l'interrupteur debe être une erreur de compilation.
Dans Java 12, ils ont introduit des améliorations à switch qui incluent les expressions switch. Cela pose le même problème avec les enums qui changent entre la compilation et l'exécution. Selon le JEP 354 ils résolvent ce problème comme suit :
Les cas d'une expression switch doivent être exhaustifs ; pour toutes les valeurs possibles, il doit y avoir une étiquette switch correspondante. (Il n'est évidemment pas nécessaire que les expressions switch soient exhaustives).
Dans la pratique, cela signifie normalement qu'une clause par défaut est nécessaire ; toutefois, dans le cas d'une expression de commutation d'enum qui couvre toutes les constantes connues, une clause par défaut est insérée par le compilateur pour indiquer que la définition de l'enum a changé entre la compilation et l'exécution. Le fait de s'appuyer sur cette insertion implicite de clause par défaut permet d'obtenir un code plus robuste ; désormais, lorsque le code est recompilé, le compilateur vérifie que tous les cas sont explicitement traités. Si le développeur avait inséré une clause par défaut explicite (comme c'est le cas aujourd'hui), une erreur possible aurait été cachée.
La seule chose qui n'est pas claire comme de l'eau de roche est ce que ferait la clause implicite par défaut. Je pense qu'elle lèverait une exception non vérifiée. (À l'heure actuelle, le JLS pour Java 12 n'a pas été mis à jour pour décrire les nouvelles expressions switch).