46 votes

isAbstract() Modifier retour résultat incorrect - Pourquoi?

À ma connaissance, le code suivant devrait imprimer `` en tant que sortie

Cependant, quand j'ai exécuté ce code, il est l'impression `` comme sortie.

De Java docs:

Retour vrai si l'argument entier comprend le modificateur abstrait, faux autrement.

Quelqu'un peut-il m'aider à comprendre ce comportement ?

49voto

Eran Points 35360

La Javadoc de l' int java.lang.Classe.getModifiers() spécifie ce qui doit être retourné pour certains des modificateurs de matrice des types (par exemple, l' final modificateur est nécessaire pour être true et de la interface modificateur est nécessaire pour être false). En revanche, il ne précise pas ce que l' abstract ou static modificateurs doivent être de types de tableau, ce qui signifie que la décision de revenir true ou false n'est pas documentée dans le JDK. Par conséquent, toute mise en œuvre peut choisir de retourner en true ou false.

int java.lang.Classe.getModifiers()

Retourne le langage Java modificateurs de cette classe ou de l'interface, sous la forme d'un entier. Les modificateurs sont constitués de la Machine Virtuelle Java de constantes pour le public, protected, private final static, abstrait et de l'interface; ils doivent être décodées à l'aide des méthodes de Modificateur de classe.

Si le sous-jacent de classe est une classe array, puis, à son public, privé et protégé modificateurs sont les mêmes que ceux de son type de composant. Si cette Classe représente un type primitif ou nulle, de son public modificateur est toujours vrai, et son protégé et privé modificateurs sont toujours fausses. Si cet objet représente un tableau de classe, d'un type primitif ou nulle, alors son dernier modificateur est toujours vrai et son interface modificateur est toujours faux. Les valeurs de ses autres modificateurs ne sont pas déterminés par la présente spécification.

Le modificateur de codages sont définis dans La Machine Virtuelle Java de Spécification, le tableau 4.1.

7voto

Mureinik Points 61228

Une allusion à ce comportement peut être trouvé dans la JLS, 10.8. Les Objets de la classe pour les Tableaux:

Chaque tableau est associé à un objet de Classe, partagé avec tous les autres tableaux avec le même type de composant.

Bien que de type tableau n'est pas une classe, la Classe de l'objet de chaque tableau se comporte comme si: [coupé]

En vertu de ce raisonnement, un tableau n'est pas une "vraie" classe, de sorte qu'il n'est certainement pas une classe concrète. La même logique s'applique à l' int.class étant considéré comme abstrait.

3voto

LuCio Points 3560

La définition de l' abstrait dit:

Une classe abstraite est une classe qui est incomplète, ou à être considéré comme incomplet.

Si il y avait un pur tableau comme [] alors il serait en effet incomplète puisque aucun type de composant est fourni.

Cela violerait la spécification de 15.10.1. La Création De La Matrice Des Expressions:

C'est une erreur de compilation si le ClassOrInterfaceType ne désigne pas un reifiable type.

Il n'est pas seulement désigner un reifiable type, mais pas du tout. Il serait donc inpossible de créer des instances d' [] - tout comme pour les classes abstraites.

Puisqu'il n'est pas pur array [] ce n'est qu'genre de spéculation. De plus les modificateurs ont été retournés pour byte[]. Il reste la spécification illustré par Eran.

2voto

Lino Points 13360

Mon explantation, les tableaux sont considérées abstract parce que les sont instanciés par la JVM elle-même.

Il y a tout juste existe pas de classe de béton pour n'importe quel type de tableau.

Un tableau est un contrat défini par le JLS :

  1. Indice D'Accessibilité
  2. La mise en œuvre de Cloneable et Serializable

Mais personne, à l'exception de la Langue elle-même peut répondre, parce que nous ne pouvons pas vraiment déclarer une mise en œuvre nous-mêmes.

2voto

Show Stopper Points 1061

De Ma compréhension du langage java specification for getModifier() est:

Si le sous-jacent de classe est une classe array, puis, à son public, privé et protégé modificateurs sont les mêmes que ceux de son type de composant. Si cette Classe représente un type primitif ou nulle, de son public modificateur est toujours vrai, et son protégé et privé modificateurs sont toujours faux

Maintenant, Les valeurs de ses autres modificateurs ne sont pas déterminés par cette spécification, par exemple ABSTRAIT.

À partir de machines virtuelles Tableau 4.1-A:

ACC_ABSTRACT 0x0400 Déclarée abstraite; ne doit pas être instanciée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X