Bonjour, j'ai la classe suivante
public class ApiResponse<T extends ApiResponseData || T extends List<ApiResponseData>>
Quand T
est un type de ApiResponseData
, mais parfois je reçois dans une liste au lieu d'un objet et dans ce cas, j'ai besoin que le T
soit étendu de ApiResponseData
ou List
comment faire cela?
Ma tentative
public class ApiResponse<T extends ApiResponseData >
3 Réponses :
Vous pouvez attendre une classe publique ApiResponse
et traiter T extend ApiResponseData
cas, comme une liste d'un élément lors de l'appel de cette méthode ( Plus haut dans votre code)
Ce n'est pas possible car il sera ambigu pour java de décider quelle classe utiliser lors de l'effacement de type. Vous pouvez utiliser Generic pour spécifier la contrainte telle que T doit être une sous-classe de plusieurs classes comme (A & B) comme
mais votre cas d'utilisation n'est pas possible.
Je pense que vous avez un malentendu fondamental sur le but des paramètres de type générique. Pourquoi pensez-vous que vous devez changer le paramètre de type pour accueillir les listes?
Pourquoi quelque chose comme ça n'est pas suffisant?
class ApiResponse<T extends ApiResponseData> { final List<T> data; ApiResponse(T datum) { data = Collections.singletonList(datum); } ApiResponse(List<T> data) { this.data = data; } }
Vous ne pouvez pas. Parce que cela n'a aucun sens pour le compilateur. Vous ne pourrez rien faire avec une instance de
T
car le compilateur ne sait pas s'il s'agira d'unApiResponseData
ou d'uneList code>. Il serait capable d'appeler toutes les méthodes qu'ils ont en commun (
Object
) mais alors vous pouvez supprimer le générique tous ensemble car vous n'avez rien gagné.