Existe-t-il un type de variable auto
dans Java que vous avez en C++?)
Un exemple:
for ( auto var : object_array)
std::cout << var << std::endl;
for( auto var : object_array)
var.do_something_that_only_this_particular_obj_can_do();
Je sais qu’il existe une boucle for améliorée en Java, mais existe-t-il une auto? Si non, y a-t-il un bidouillage à faire? Je fais référence à la nouvelle fonctionnalité de C++ 11
Répondu avant que la question ne soit [~ # ~] modifiée [~ # ~] :
Non, il n'y a pas de type de variable auto
en Java. La même boucle peut être réalisée comme suit:
for ( Object var : object_array)
System.out.println(var);
Java a des variables locales, dont la portée est dans le bloc où elles ont été définies. Similaire à C et C++, mais il n'y a pas de mot clé auto ou register. Cependant, le compilateur Java n'autorisera pas l'utilisation d'une variable locale non explicitement initialisée et donnera une erreur de compilation (contrairement à C et C++ où le compilateur ne donne généralement qu'un avertissement). Courtoisie: Wikipedia .
Non, il n'y a pas d'inférence de type classique dans Java comme le C++. Il y avait un RFE mais c'était fermé comme "ne résoudra pas", la raison invoquée était:
Les humains bénéficient de la redondance de la déclaration de type de deux manières. Premièrement, le type redondant sert de documentation précieuse - les lecteurs ne doivent pas rechercher la déclaration de getMap () pour savoir quel type il renvoie. Deuxièmement, la redondance permet au programmeur de déclarer le type voulu et de bénéficier ainsi d’un contrôle croisé effectué par le compilateur.
Pourrait être Java 10 a ce que vous (et moi-même) voulons, par le mot clé var
.
var list = new ArrayList<String>(); // infers ArrayList<String>
var stream = list.stream(); // infers Stream<String>
De propositions d'amélioration JDK 286
Mise à jour: Yap, cette fonctionnalité a été intégrée à la Java 10 version!
Java 7 introduit la syntaxe en diamant
Box<Integer> integerBox = new Box<>(); // Java 7
Par rapport au vieux Java
Box<Integer> integerBox = new Box<Integer>(); // Before Java 7
Le lecteur critique remarquera que cette nouvelle syntaxe n'aide pas à écrire les boucles for de la question d'origine. C'est correct et totalement intentionnel semble-t-il. Voir l’autre réponse qui cite la base de données de bogues d’Oracle.
Dans Java 8, vous pouvez utiliser l'inférence de type lambda pour éviter de déclarer le type. L'analogue aux exemples de l'interrogateur serait:
object_array.forEach(var -> System.out.println(var));
object_array.forEach(var -> var.do_something_that_only_this_particular_obj_can_do());
ces deux éléments peuvent également être simplifiés à l'aide de références de méthodes:
object_array.forEach(System.out::println);
object_array.forEach(ObjectType::do_something_that_only_this_particular_obj_can_do);
En bref, non, il n'y a pas de type automatique. Si tout ce que vous faites est d’imprimer la valeur, vous pouvez simplement vous référer à la valeur en tant que Object
.
Ce n'est pas une solution pure Java, mais l'ajout d'une bibliothèque appelée lombok permettra à la magie ci-dessous de se compiler et de fonctionner de manière très similaire au mot clé auto
dans C++
List<String> strList = Arrays.asList("foo", "bar", "baz");
for (val s: strList){
System.out.println(s.length());
}