J'ai cette question.
J'ai class UserImpl implements MyUser, YourUser
et class UsersGetterImpl implements MyUsersGetter, YourUsersGetter
. Je veux mettre en œuvre une méthode à l'intérieur UsersGetterImpl
, qui retourne List<MyUser> getUsers()
pour MyUsersGetterinterface
et List<YourUser> getUsers()
pour YourUsersGetterinterface
, mais je ne peux pas comprendre ce que doivent être le type de retour de getUsers()
dans la UsersGetterImpl
classe - sans doute il doit être quelque chose avec des jokers (comme List<? extends UserImpl> getUsers()
, mais pas exactement, parce que cet exemple ne fonctionnera pas ...)problème avec les caractères génériques et une classe qui implémente deux interfaces
Répondre
Il est difficile de dire ce que vous demandez, mais selon la Java Language Specification:
Dans une situation telle que celle-ci:
interface Fish { int getNumberOfScales(); }
interface StringBass { double getNumberOfScales(); }
class Bass implements Fish, StringBass {
// This declaration cannot be correct, no matter what type is used.
public ??? getNumberOfScales() { return 91; }
}
Il est impossible de déclarer une méthode getNumberOfScales nommé avec la même signature et le type de retour que celles des deux méthodes déclarées dans les poissons d'interface et dans l'interface Stringbass, car une classe peut avoir qu'une seule méthode avec une donnée signature (§8.4). Par conséquent, il est impossible pour une seule classe d'implémenter à la fois l'interface Fish et l'interface StringBass. Cependant, si vos deux interfaces spécifient le même type de retour, vous pouvez alors aller de l'avant et implémenter cette méthode. Si MyUser
et YourUser
ont un ancêtre commun, alors vous pourriez faire List<? extends User>
ou si elles ont rien de commun, vous pouvez utiliser simplement utiliser List<?>.
À ce moment-là cependant, vous devez arrêter et de considérer si une implémentation commune est ce que vous voulez réellement. Je soupçonne qu'il pourrait y avoir une solution plus élégante, si vous nous avez fourni plus de détails sur votre problème.
Edit:
Sur la base de votre commentaire, vous voulez quelque chose comme ...
interface MyUserGetter { List<? extends MyUser> getUsers(); }
interface YourUserGetter { List<? extends YourUser> getUsers(); }
class UserGetterImpl { List<? extends UserImpl> getUsers(); }
Ceci est non testé, et je suppose que a une chance de 50% de travail.
La suggestion architecturale est qu'au lieu d'avoir une seule mise en œuvre de deux interfaces vous pourriez effectivement vouloir deux implémentations d'une interface:
interface User {}
class MyUser implements User {}
class YourUser implements User {}
interface UserGetter { List<? extends User> getUsers(); }
La réponse courte est: il ne peut pas être fait. Vous ne pouvez pas avoir deux méthodes dont la signature ne diffère que par le type de retour, et vous ne pouvez donc pas avoir une classe implémentant deux interfaces qui définissent des méthodes qui ne diffèrent que par le type de retour. La solution facile est de faire MyUsersGetter et YourUsersGetter avoir des méthodes avec des noms différents.
Une solution possible serait d'avoir UsersGetterImpl pas mis en œuvre MyUsersGetter et YourUsersGetter directement, mais d'avoir des délégués:
class UsersGetterImpl {
public MyUsersGetter getMyUsers() {
return new MyUsersGetter() {
public List<MyUsers> getUsers() {
//do stuff here
}
}
}
Oui, mais vous pouvez le faire: Interface MyUser {} \t Interface youruser {} \t UserImpl de classe implémente MyUser, youruser {} \t \t MyUserGetter interface {MyUser getUser();} \t Interface YourUserGetter {youruser getUser();} \t \t classe UserGetterImpl implémente MyUserGetter, YourUserGetter { \t \t publique UserImpl getUser() { \t \t \t return new UserImpl(); \t \t}} \t Je veux ajouter des méthodes Liste getUsers() à l'intérieur de l'interface MyUserGetter et la liste getUsers() à l'intérieur et l'interface YourUserGetter la seule liste de mise en œuvre de ????> getUsers() à l'intérieur UserGetterImpl –