2010-07-27 3 views
1

Quelle serait la meilleure façon d'archiver un objet passé dans une méthode étendue d'une classe donnée?Java assurant qu'un objet passé à une méthode étend une classe donnée

Actuellement, j'ai une méthode qui prend un ByteBuffer de données pour envoyer et une classe « joueur » que je l'ai écrit, et files d'attente vers le haut de données sur le serveur IO à envoyer au client:

public void send(ButeBuffer toSend, Player player) 
{ 
    // prep the byte buffer for sending, and queue it on the IO server 
} 

Ce que je voudrais être capable de faire est de laisser l'objet joueur passé être n'importe quel objet qui étend la classe de joueur. Je l'ai fait quelques recherches et trouvé quelque chose comme ceci:

public void send(ByteBuffer toSend, Player<? extends Player> player) 
{ 
    // prep the byte buffer for sending, and queue it on the IO server 
} 

Mais qui me donne des erreurs de compilation, et je ne comprends pas exactement ce qui se passe. Serait-ce la bonne façon de faire cela? Et si c'est le cas, quelqu'un pourrait-il expliquer ce que ce code fait spécifiquement et pourquoi cela ne fonctionne pas et ou me lier à un article qui explique cela plus en détail.

Alternatlly, je suppose que je pourrais le mettre en place quelque chose comme ceci:

public void send(ByteBuffer toSend, Object player) 
{ 
    // Check that the player extends Player, using instanceof or something 
    // along those lines 

    // Prep the ByteBuffer, and queue the data to send 
} 

Cependant, ce code se sent sorte de fragile pour moi, par rapport au code ci-dessus.

Toute aide est la bienvenue. Merci :)

+0

'Lecteur 'exigerait que la classe de joueur soit une classe générique:' public class Player {... 'Et même si vous en faisiez une classe générique, vous obtiendriez des avertissements de compilateur sauf si vous aviez quelque chose comme' Player > '. Les classes génériques sont plus destinées à contenir des informations arbitraires, telles qu'une collection (voir 'java.util.ArrayList' pour un exemple). Comme d'autres l'ont dit, votre premier échantillon de code est le meilleur pour votre objectif. –

Répondre

7

Si je ne me trompe pas, vous pouvez conserver la première syntaxe (en attendant un objet Player) et cela fonctionnerait avec n'importe quelle sous-classe de Player. C'est le polymorphisme.

+0

Vous apprenez quelque chose de nouveau tous les jours! Merci pour l'info :) – vimalloc

3

Votre définition actuelle de send accepte déjà une sous-classe de Player (ou la mise en œuvre, si vous décidez plus tard de faire Player une interface).

2

Actuellement, votre méthode acceptera n'importe quelle sous-classe de Player (si vous utilisez la première méthode). Mais si vous voulez faire cela avec une interface (pour assurer que les méthodes spécifiques sont mises en œuvre et que vous pouvez les appeler), vous pouvez essayer genericizing la classe et faire quelque chose comme ceci:

public class MyClass<T extends PlayerInterface> { 
    public void send(ByteBuffer toSend, T player) {  
     // prep the byte buffer for sending, and queue it on the IO server 
    } 
} 

Mais cela pourrait être surpuissant . Dans ce cas, il vaut peut-être mieux utiliser une interface comme paramètre:

public void send(ByteBuffer toSend, PlayerInterface player) {  
    // prep the byte buffer for sending, and queue it on the IO server 
} 
2

La première méthode est correcte.

public void send(ButeBuffer toSend, Player player) 
{ 
    // prep the byte buffer for sending, and queue it on the IO server 
} 

Il assure que seuls les objets de type lecteur (ou des objets qui se prolongent joueur) sont des paramètres valides ..

Je recommande l'utilisation d'interfaces pour définir ce qui est permis ce qui est un pas autorisé en tant que paramètre.

Questions connexes