Cette méthode doit prendre deux objets maintenant, pourquoi le compilateur accepte-t-il deux paramètres avec Types distinctifs? p> EDIT: strong>
Maintenant que je sais que les deux paramètres deviennent implicitement posés, je me demande pourquoi le compilateur appel: randomList(new ArrayList<String>(), new ArrayList<Integer>()); // Does not Compile
4 Réponses :
Ainsi, le code est donc équivalent à: < / p> Qu'est-ce qui peut être encore plus surprenant, c'est que les compilations suivantes: p> Le deuxième argument est en boîte automatique dans Un t code> est déduit d'être
objet code>, et les deux arguments sont implicitement arrêtés. strong>
INTEGER code>, puis les deux arguments deviennent UPCUT sur
objet code>. p> p>
En haut de ma tête, les deux sérialisables code> et
comparables code>. Accrochez-vous,
comparable > Code>, er,
comparable s'étend comparable > & Serializable> code>, oh
@ 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.
Parce que vous ne l'appelez pas de manière généralisée. Essayez et vous obtiendrez une erreur de compilation. P> ou permet au compilateur déduire le type, et vous devez également obtenir une erreur de compilation: p> < Pré> xxx pré> p>
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) code> 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) Code> ALORS
FOO (aléatoire (....)) code>. Le point est qu'il n'ya pas assez dans l'appel par lui-même pour attacher
t code> à
chaîne code>.
Vous pouvez ajouter un peu plus de contraintes sur les types de paramètres p> dans votre exemple de liste, vous Besoin de cartes génériques pour obtenir l'effet similaire p> t code> est désigné être le type commun commun de
chaîne code> et
integer code>, qui est
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: P> blockQuote>
Parce que même lorsque
A code> est un sous-type de
B code>,
list code> n'est pas un sous-type de
Liste code> si A et B sont différents. P>
Parce qu'ils sont tous les deux code> objet code> s.
@ user1914126 .. comme il se trouve, votre code ne doit pas compiler. Il vous manque un
neuf code> avant
entier (10) code>.
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)); code>. Ce serait une erreur.