Parfois, en Java, il y a un cas où vous utilisez une bibliothèque qui fournit un final class Car
et vous souhaitez mettre en place une interface Vehicle
pour que vous puissiez faire Truck
et Bus
classes et les traiter tous comme des véhicules dans votre code. Mais Car est définitif et n'implémente aucune interface.Convertir une classe finale en une interface compatible que la classe ne prétend pas implémenter
Comment puis-je transférer la classe Car
finale de quelqu'un d'autre à mon interface Vehicle
pour que je puisse la transmettre comme mes autres véhicules? Chaque méthode d'instance sur Vehicle serait compatible à 100% avec une méthode similaire sur Car en termes de noms de méthode d'instance, de types d'argument et de type de retour. Ce serait l'équivalent d'une perspective Duck-Typing.
Je sais que je pourrais créer une classe wrapper MyCar extends Vehicle
qui ne ferait que déléguer chaque appel de méthode à un objet Car interne. Ce serait le Java Way. Mais je me demande simplement s'il existe une technique pour lancer une classe sur une interface non liée (mais 100% compatible). C'est OK si la réponse est mauvaise.
Non, la solution d'emballage (composition) est la seule voie. –
Vous pouvez utiliser une interface proxy JDK. – chrylis
@PaulBoddington Est-ce une limitation JVM ou une limitation de langage Java? Je veux dire, avec le piratage du classloader ou bytecode, pourrait-on contourner cette limitation? Je pense que Clojure et Groovy peuvent faire quelque chose comme ça. – GlenPeterson