2008-12-11 7 views

Répondre

3

Pas vraiment, ou du moins pas pratiquement.

Les sous-types doivent fonctionner comme des ensembles dans la théorie des ensembles mathématiques. Si B est un sous-ensemble de A, tout élément de B est également un élément de A.

De même, si B est un sous-type de A, tout élément de B est également un élément de A. Ainsi, tout Ceci étant dit, il peut y avoir des façons convoquées que B puisse surcharger certaines opérations pour casser explicitement la possibilité de l'utiliser dans une collection ou de l'instancier. Je ne pense pas que les génériques résoudront ce problème. Je ne pense pas que les génériques puissent résoudre ce problème.

2

Vous pouvez utiliser "final" dans la définition de classe de la classe contenue pour interdire le sous-typage. Je ne vois pas immédiatement comment vous pouvez tester cela ou limiter vos génériques pour exiger des classes finales. Vous pouvez utiliser la réflexion pour tester si la classe a l'ensemble de modificateur final, par exemple lors de la construction de la collection, et lancer si ce n'est pas le cas. Si la classe elle-même n'est pas finale, vous pouvez vérifier chaque objet ajouté à la collection pour vous assurer que sa classe d'exécution est exactement la classe voulue par la collection et non une sous-classe de celle-ci.

Voir http://java.sun.com/docs/books/tutorial/reflect/ pour plus d'informations sur la réflexion sur Java.

3

Si vous créez une classe de collection personnalisée, vous pouvez vérifier la classe de l'objet à insérer à l'aide de la réflexion et la rejeter si elle ne correspond pas à un type exact particulier. Sinon, si vous avez le contrôle sur la définition de classe de la classe contenue dans la collection, la rendre finale empêchera la création de sous-classes. (évidemment c'est un problème si vous avez besoin de sous-classes pour une autre utilisation)

3

La question est: pourquoi voudriez-vous cela. Si vous avez une liste contenant des animaux, pourquoi voudriez-vous remplir cette liste seulement avec "l'animal de base", mais empêcher les chiens ou les chats d'être ajoutés à la liste. L'un des concepts de base de OO est que vous utilisez une instance d'une sous-classe partout où vous avez besoin par exemple de la classe de base (Wikipedia: Liskov substitution principle). Si cela ne s'applique pas dans votre situation, il se peut que quelque chose ne fonctionne pas dans votre hiérarchie de classes.

Questions connexes