2
votes

Comment puis-je indiquer qu'une classe générique s'étend d'une classe ou d'une autre?

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 > 


1 commentaires

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'un ApiResponseData ou d'une List . 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é.


3 Réponses :


1
votes

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)


0 commentaires

1
votes

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.


0 commentaires

4
votes

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;
    }
}


0 commentaires