Le compilateur Eclipse refuse de compiler le code suivant, indiquant que le champ S n'est pas visible. (L'aspect de l'IBM J Compiler refuse également, indiquant que "S n'a pu être résolu") Pourquoi? La spécification de langue Java Spécification STATS: P> Sinon, nous disons qu'il y a de la valeur par défaut
accès, qui n'est autorisé que lorsque
L'accès se produit de l'intérieur de la
paquet dans lequel le type est déclaré. P>
blockQuote> La manière dont je comprends, le champ est déclaré et accessible dans la même unité de compilation, donc dans le même paquet, et doit donc être accessible. P> encore plus étrangement, ajoutant un Diminué de ai-je trébuché sur un bug de compilateur, ou mal compris la spécification Java? p> Plateforme Eclipse P>
Version: 3.4.2 ID de construction:
M20090211-1700 P>
BlockQuote> JDK 1.6.0 P> Edit 2 strong>
En effet, Javac accepte le code. J'avais été testé en exécutant la construction de fourmis, qui utilise ... p> p>
? EXTENEZ TEST CODE> TO
TEST CODE> Effectue le champ Visible, c'est-à-dire que le code suivant compile: p>
5 Réponses :
Je ne peux pas reproduire ce que vous dites. Celles-ci sont toutes deux correctes pour moi sans avertissement, erreur ou quoi que ce soit avec Javac directement.
WinXP, Javac 1.6.0_16 P>
Non, j'ai essayé avec Eclipse (V3.4.1, ID de construction: M20080911- 1700) et pour le premier, il dit: p> au moins pour le niveau de conformité du compilateur 1.6 et 1.5.
La chose amusante étant, si vous regardez les options de correction rapide, il répertorie un pour le niveau de conformité du compilateur 1.4 (comme on l'attendait) dans Eclipse pour le premier une personne que j'ai p> et pour la seconde, je reçois p> si je spécifie et pour le second, je reçois p> Modifier la résolution de 's' code>. Lequel bien sûr ne résout pas le problème. Donc, le compilateur Eclipse et le "générateur" de correctif rapide semblent avoir une vue différente sur cela aussi; -) P>
- Source 1.4 code> et
cible -1.4 code> dans la ligne de commande directement
javac code> dit pour la première p>
Je suis maintenant sur un autre ordinateur, où Javac accepte le code, mais Eclipse n'est toujours pas. Que dit votre éclipse? Je vais répéter mon test sur la machine d'origine demain pour m'assurer que j'ai testé correctement.
Eh bien, voyons. Je dirais que le compilateur ne peut pas bien garantir que puis dans certaines sous-classes et oups! modifier: dans un sens, autre.backage.banana Ne n'a pas em> un champ foo () code> sera appelé par une entité dans l'emballage, et ne peut donc pas garantir que
s code> est visible. Par exemple, ajoutez
banane code> dans un autre paquet em> p>
getclass () code> rendements
banane code>, qui ne peut pas voir
s code>. p>
s code>. Si la banane était em> dans le même paquet, il pourrait toujours avoir sa propre propriété
S code> et devrait se référer à
Test code> S
s code> via
super code>. p> p>
Je crois comprendre que la banane ne peut pas voir S signifie que le code dans la banane de l'unité de compilation ne peut pas accéder à l'art. Mais mon code est dans le test de l'unité de compilation ...
Oui, votre code est dans le test de l'unité de compilation, mais une sous-classe putative pourrait ne pas être, et cette classe sera le résultat de GetClass (), et que la classe ne peut pas voir le champ protégé contre le paquet. L'erreur du compilateur est correcte, je pense.
Essayez ceci: [modifier à clarifier]: p> [Dernières pensées]:
Je crois que le compilateur Eclipse est en réalité (soigneusement) correct ici. L'objet getclass (). Cast (O) code> retourne un objet de type '
capture n ° 1 - de? Étend le test code> 'et pas
test code>. La question est donc liée aux génériques et à la manière dont le compilateur traite. Je ne connais pas les détails de la spécification sur les génériques, mais que certains compilateurs (par commentaires ici) acceptent votre code, il s'agit donc d'un trou de boucle dans la spécification ou que certains de ces compilateurs ne sont pas entièrement en fonction de la spécification. < / p>
o code> peut en fait être une extension du test (et défini dans un autre paquet) et le compilateur n'a aucun moyen de savoir si c'est bien le cas ou non. Donc, il le traite comme le pire cas d'une instance d'une extension définie dans un autre paquet. Il aurait été super correct si l'ajout d'un qualificatif
final code> à la classe
Test code> aurait permis d'accéder au champ
s code>, mais ce n'est pas. p> p>
Remarque Ce qui précède a été compilé sur Mac OS X / Eclipse 3.4.
Euh ... je l'ai déjà fait? Ou que renonce à la variable locale de mon extrait de 2e code accomplir? Je sais que ça marche. Ma question est la raison pour laquelle le premier extrait ne le fait pas.
Ce n'est pas parce que vous supposez que la capture générique est également définie dans le même paquet par le compilateur. Si ce n'est pas le cas, la visibilité de niveau de paquet ne s'applique plus.
(Et désolé, j'ai écrémé votre message et j'ai raté la fin.)
En fait dans presque tous les cas, sauf si nécessaire par des génériques, c'est mieux (et plus sûr) d'utiliser l'opérateur de Cast de Java. J'ai discuté ici . Java Cast Operateur a examiné par-dessus Verbose, mais c'est le bon outil ici.
Remplacement de Mode code> La méthode avec l'opérateur compile tout simplement à Eclipse. P>
public class Test {
String s;
void foo(Object o) {
String os = ((Test) o).s;
}
}
très bizarre. Pour une raison inconnue (pour moi), le compilateur Eclipse nécessite une fonte explicite: tandis que le code compile parfaitement sans le coulé avec JDK de Sun (je cours la version 1.6.0_16 sur GNU / Linux). P> P>
problème kewl. Où est Josh Bloch?