Java - Passer ArrayList du type d'interface
J'ai une interface Dommageable comme suit
public interface Damageable {
public void handleCollision(float impulse);
}
une classe qui implémente cette interface, BaseObject
public class BaseObject implements Damageable
Maintenant dans une troisième classe, j'ai une liste de tableaux de type BaseObject
public class ObjectManager {
public ArrayList<BaseObject> bodies;
Ce que je suis en train de faire est de passer à la liste de tableaux corps à une méthode d'une autre classe qui accepte ArrayList
public CollisionManager( ArrayList<Damageable> _bodies) {
bodies = _bodies;
}
Java ne pas me laisser faire de nouvelles CollisionManager(les organes) où le corps est de type ArrayList et BaseObject met en œuvre Délicate
J'ai essayé de casting. Dit ne peut pas lancer de
ArrayList<BaseObject>
à ArrayList
Également essayé d'utiliser Class<? extends Damageable>
mais alors je ne suis pas en mesure d'appeler les méthodes déclarées dans l'interface Dommageable. Comment puis-je passer le ArrayList?
source d'informationauteur wirate
Vous devez vous connecter pour publier un commentaire.
Vous devez être explicite avec vos génériques. Par conséquent, vous devez informer le compilateur que votre type générique n'est pas ont être un
Damagable
en soi, elle peut au contraire étendreDamagable
:Par le chemin, vous remarquerez que j'ai changé votre variable
bodies
plutôt que_bodies
. Souligne ne font pas partie de la norme Java conventions de codage.Edit en réponse à l'OP commentaires
Disons que, au lieu d'une interface, vous avez eu une béton classe appelée
Damagable
. Dire que le compilateur<? extends Damagable>
dit qu'il n'a pas à être une instance deDamagable
. C'est bon que le type étendreDamagable
. Sinon, le compilateur suppose que vous avez unDamagable
exactement.Il ne veut pas faire comme beaucoup de sens quand vous pensez à
Damagable
comme une interface, car il n'y a pas de cas où vous auriez un exemple deDamagable
. Mais ils fonctionnent essentiellement de la même manière.Vous devez vous rappeler que vous travaillez avec Java typeset non des classes. Java du type de syntaxe et de la structure est moins robuste que c'est la structure de la classe. Il n'y a pas de notion de
implements
quand il s'agit de types.Dernière série de modifications
Enfin, je note qu'il est généralement préférable d'utiliser une interface pour la méthode/paramètres du constructeur et de la méthode des types de retour. Cela permet à vous et à ceux qui utilisent vos méthodes à utiliser quelle que soit mise en œuvre vous s'il vous plaît, et vous permet de modifier votre application comme vous s'il vous plaît.
Donc, avec ces modifications, vous devrez:
Essayer
ArrayList<? extends Damageable > _bodies
.Ce dit que vous voulez une liste de tableaux comprenant un
Class
qui s'étend (bien implémente)Damageable
D'autres ne manqueront pas de souligner les solutions techniques à partir de la syntaxe Java perspective.
Je vais juste parler de quelques problèmes de conception que vous devriez peut-être envisager:
CollisionManager(ArrayList<BaseObject>)
? Sauf si vous allez utiliser Dommageable ailleurs (c'est à dire il y a des choses qui sont Dommageables mais ne sont pas BaseObjects) alors il semble inutile de faire abstraction.