web-dev-qa-db-fra.com

Existe-t-il des déductions automatiques en Java?

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

91
Games Brainiac

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.

35
NINCOMPOOP

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!

43
sorrymissjackson

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.

24
Tarrasch

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);
17
Ajit George

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.

8
SimonC

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());
}
3
samvel1024