Existe-t-il une inférence de type automatique en Java?


Existe-t-il un type de variable auto en Java comme vous l'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, est-il un hack pour faire cela? Je fais référence à la nouvelle fonctionnalité de C++11

Author: Cœur, 2013-04-21

6 answers

Répondu avant que la question soit ÉDITÉE :

Non il n'y a pas de type de variable auto en Java. La même boucle peut être réalisée comme:

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 habituellement seulement donner un avertissement). Courtoisie: Wikipedia.

Non, il n'y a pas d'inférence de type grand public en Java comme C++ . Il y avait un RFE mais cela a été fermé comme "Ne fixera pas", la raison donnée était:

Les humains bénéficient de la redondance de la déclaration de type de deux manières. Tout d'abord, le type redondant sert de documentation précieuse - les lecteurs ne le font pas vous devez rechercher la déclaration de getMap () pour savoir de quel type il s'agit retourner. Deuxièmement, la redondance permet au programmeur de déclarer le type, et ainsi bénéficier d'une vérification croisée effectuée par le compilateur.

 28
Author: NINCOMPOOP, 2013-07-12 04:26:24

Java 7 introduit la syntaxe diamond

Box<Integer> integerBox = new Box<>(); // Java 7

Par rapport à l'ancien 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 dans la question d'origine. C'est correct et entièrement intentionnel, semble-t-il. Voir l'autre réponse qui cite la base de données de bogues d'Oracle.

 23
Author: Tarrasch, 2013-07-31 23:27:53

En Java 8, vous pouvez utiliser l'inférence de type lambda pour éviter de déclarer le type. L'analogue aux exemples du questionneur serait:

object_array.forEach(var -> System.out.println(var)); 
object_array.forEach(var -> var.do_something_that_only_this_particular_obj_can_do());

Les deux peuvent également être simplifiés en utilisant des références de méthode:

object_array.forEach(System.out::println); 
object_array.forEach(ObjectType::do_something_that_only_this_particular_obj_can_do);
 15
Author: Ajit George, 2016-05-09 16:37:34

Peut être Java 10 a ce que vous (et moi) voulez, via le mot-clé var.

var list = new ArrayList<String>();  // infers ArrayList<String>
var stream = list.stream();          // infers Stream<String>

À Partir de JDK Amélioration des Propositions 286


Mise à jour: Yap, cette fonctionnalité est entrée dans la version Java 10!

 15
Author: sorrymissjackson, 2018-04-30 08:56:49

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 comme Object.

 8
Author: SimonC, 2013-04-21 15:25:07

Ce n'est pas une solution Java pure, cependant l'ajout d'une bibliothèque appelée lombok permettra à la magie ci-dessous de compiler et de fonctionner très similaire au mot-clé auto en C++

List<String> strList = Arrays.asList("foo", "bar", "baz");
for (val s: strList){
    System.out.println(s.length());
}
 3
Author: Abrahamyan Samvel, 2017-10-22 21:22:35