7
votes

Pourquoi cette méthode de Java générique accepte-t-elle deux objets de type différent?

Cette méthode doit prendre deux objets du même type fort> et renvoyer l'un de ces objets par hasard: xxx pré>

maintenant, pourquoi le compilateur accepte-t-il deux paramètres avec Types distinctifs? p> xxx pré>

EDIT: strong> Maintenant que je sais que les deux paramètres deviennent implicitement posés, je me demande pourquoi le compilateur fait strong> se plaint lorsque vous appelez la méthode suivante: p> xxx pré>

appel:

randomList(new ArrayList<String>(), new ArrayList<Integer>()); // Does not Compile


3 commentaires

Parce qu'ils sont tous les deux objet s.


@ user1914126 .. comme il se trouve, votre code ne doit pas compiler. Il vous manque un neuf avant entier (10) .


Oui, si vous voulez que le compilateur se plaint, vous devriez le dire ce que T est censé être lorsque vous appelez la méthode, par ex. myClass. aléatoire ("string1", nouvel entiers (10)); . Ce serait une erreur.


4 Réponses :


11
votes

t est déduit d'être objet , et les deux arguments sont implicitement arrêtés.

Ainsi, le code est donc équivalent à: < / p> xxx

Qu'est-ce qui peut être encore plus surprenant, c'est que les compilations suivantes: xxx

Le deuxième argument est en boîte automatique dans Un INTEGER , puis les deux arguments deviennent UPCUT sur objet .


2 commentaires

En haut de ma tête, les deux sérialisables et comparables . Accrochez-vous, comparable , er, comparable & Serializable> , oh oh j'abandonne. Attribuez-le à quelque chose de stupide et regardez le message d'erreur du compilateur.


@ Tomhawtin-Tackline: Vous avez tout à fait raison, même si je n'ai pas encore compris comment travailler ces détails dans la réponse sans obscurcir le point.



1
votes

Parce que vous ne l'appelez pas de manière généralisée. Essayez xxx

et vous obtiendrez une erreur de compilation.

ou permet au compilateur déduire le type, et vous devez également obtenir une erreur de compilation: < Pré> xxx


3 commentaires

Vous n'avez pas besoin de spécifier le type d'une méthode pour obtenir un comportement générique. entier x = aléatoire (1, 2) est également valide.


Oui, je modifiez toujours ma réponse pour ajouter une note sur l'inférence de type.


@Jandvorak ou s'il y a Void FOO (String S1, String S2) ALORS FOO (aléatoire (....)) . Le point est qu'il n'ya pas assez dans l'appel par lui-même pour attacher t à chaîne .



5
votes

t est désigné être le type commun commun de chaîne et integer , qui est xxx < p> Eh bien, personne n'a besoin de se soucier de cela.

Vous pouvez ajouter un peu plus de contraintes sur les types de paramètres xxx

dans votre exemple de liste, vous Besoin de cartes génériques pour obtenir l'effet similaire xxx


0 commentaires

3
votes

SAVOIR que je sais que les deux paramètres sont implicitement opposés, Je me demande pourquoi le compilateur se plaint lorsque vous appelez ce qui suit Méthode:

Parce que même lorsque A est un sous-type de B , list n'est pas un sous-type de Liste si A et B sont différents.


0 commentaires