Nom de la classe Java contenant le signe du dollar ne peut pas compiler si un intérieur classe est présent
J'ai Java suivant les classes définies:
mac-grek:javajunk grek$ cat A$B.java
class A$B {}
mac-grek:javajunk grek$ cat A.java
public class A {
public static class B {}
}
mac-grek:javajunk grek$ cat Main.java
public class Main {
public static void main(String[] args) {
System.out.println(A.B.class.getName());
System.out.println(A$B.class.getName());
}
}
Lorsque j'essaie de compiler, j'obtiens les erreurs suivantes:
mac-grek:javajunk grek$ javac 'A$B.java' A.java Main.java
A.java:2: duplicate class: A.B
public static class B {}
^
Main.java:4: cannot find symbol
symbol : class B
location: class A
System.out.println(A.B.class.getName());
^
Main.java:5: cannot find symbol
symbol : class A$B
location: class Main
System.out.println(A$B.class.getName());
^
3 errors
Si je supprime A.java
fichier et System.out.println(A.B.class.getName());
de Main.java
tout compile:
mac-grek:javajunk grek$ cat A$B.java
class A$B {}
mac-grek:javajunk grek$ cat Main.java
public class Main {
public static void main(String[] args) {
System.out.println(A$B.class.getName());
}
}
mac-grek:javajunk grek$ javac A$B.java Main.java
mac-grek:javajunk grek$
Donc Java me permet de définir une classe contenant le signe du dollar dans son nom. Comment puis-je compiler mon exemple original?
- A,$B signifie que B est un intérieur de classe de l'Un, peut vous suggérer de lire download.oracle.com/javase/tutorial/java/javaOO/nested.html
- Pas vraiment parce que je peux définir Une classe nommée$B et c'est pas de l'intérieur de la classe d'une autre classe comme mon deuxième exemple montre.
Vous devez vous connecter pour publier un commentaire.
Vous avez un conflit de nom, car vous avez défini un haut-niveau de la classe A,$B ayant le même nom que le nom généré pour un statique à l'intérieur de la classe B de la classe A. Depuis que vous avez à la fois, le compilateur ne peut pas résoudre le conflit.
Le JLS dit:
Depuis que vous avez décidé de ne pas respecter cette règle, vous vous êtes mordu par javac. Je voudrais juste renommer Un$B à autre chose.
$
peuvent varier d'une version de Java à l'autre. D'autres usages peut venir de la 3ème partie logiciel.Je suis en désaccord. Pour moi, il dit "ne fais pas ça ... sauf si vous savez ce que vous faites". Il ne dit pas pourquoi, mais il n'est pas nécessaire. En effet, il ne peut pas expliquer pourquoi, parce que certaines des utilisations de
'$'
dans les identificateurs pourrait venir de la 3e partie du logiciel.Il n'a pas de "soins". Mais d'un autre côté il ne suppose que vous savez ce que vous faites si vous choisissez d'ignorer l'JLS conseils.
Le point est que les gens qui écrivent les générateurs sont censés savoir que le binaire noms de classe pour les classes internes sont représentés à l'aide de la
'$'
caractère. Autres personnes devraient tout simplement de suivre les conseils dans le JLS.La raison que le Langage Java Spécification ne définit pas comment la JVM utilise
'$'
est "la séparation des préoccupations". À partir de la JLS point de vue, ce n'est qu'un détail d'implémentation. En effet, il est concevable que quelqu'un va mettre en œuvre le langage Java pour une machine virtuelle plate-forme qui traite de l'intérieur des classes différemment.Il n'est pas possible de répondre que de façon définitive. Et c'est probablement une bonne chose qu'il n'est pas possible; voir ci-dessous.
Il y a des domaines où il serait mauvais pour la JLS être formel et précis. C'est l'un d'entre eux. Par exemple, si ils ont déclaré que '$' pourrait en toute sécurité si vous avez suivi les règles de X, Y et Z, ce serait limite leur utilisations possibles de '$' dans les futures versions de Java. Changer les règles de ce que les identifiants sont réalisables pourraient entraîner d'importants du code source de la compatibilité des maux de tête.
(Autres zones où ce principe s'applique le Modèle de Mémoire et de la sémantique de la collecte des ordures.)
La JLS ne se réfère pas à votre état mental. Ceux qui ont été mon mots.
À la fois votre classe
class A$B
et votrestatic class B
partage le même. Compilateur génèreOuterClassName$InnerClassName
comme nom de classe pour les classes imbriquées