Je veux déclarer une variable qui contient une classe qui implémente une interface spécifique. Spécifiquement, j'essaye de stocker un SocketChannel
et un DatagramChannel
dans la même propriété ainsi je peux les employer de manière interchangeable. Ces deux classes étendent SelectableChannel
et implémentent également ByteChannel
, et je souhaite appeler des méthodes des deux. Je ne veux pas stocker cela dans deux variables séparées, parce que moi, ils doivent être le même objet. Je veux passer cet objet dans une variable au constructeur.Comment déclarer une variable qui contient une sous-classe d'une classe qui implémente une interface?
Est-il même possible de faire cela? Si non, quelles sont les solutions de contournement communes qui supportent encore ce type de modèle? Pour plus de clarté, voici les déclarations (incorrectes) qui pourrait décrire ce que je suis en train de faire, étaient-ils valides:
private SelectableChannel & ByteChannel byteChannel; private SelectableChannel implements ByteChannel byteChannel; private ? extends SelectableChannel implements ByteChannel byteChannel;
S'il vous plaît Note:
Je ne cherche pas d'autres façons de gérer mise en réseau qui évite ce problème, ou d'autres moyens de mettre en œuvre le réseautage. Cette question concerne la déclaration d'une variable pour contenir une sous-classe d'une classe qui implémente également une interface spécifique. J'ai seulement donné les détails pour que vous sachiez que je ne peux pas créer une nouvelle interface ou sous-classe parce que dans ce cas toutes les classes impliquées font partie du paquet java.nio
.
Je suppose que je pourrais tester dans le constructeur et jette un '' InvalidArgumentException' si le SelectableChannel' est pas un instance de 'ByteChannel'. Ensuite, je pourrais stocker l'objet dans deux propriétés et utiliser chacune d'elles pour accéder à la méthode que je souhaite. –
Si vous obtenez le canal de "outside" (c'est-à-dire que la classe n'a pas de contrôle direct sur la création du canal), alors le vérifier dans le constructeur serait en effet une bonne idée. – Jesper