Есть ли автоматический тип вывода на Java?

Существует ли тип переменной auto в Java, как у вас на С++?

Пример:

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();

Я знаю, что в Java существует расширенный цикл for, но есть ли авто? Если нет, есть ли взлом для этого? Я имею в виду новую функцию в С++ 11

Ответ 1

Ответ на вопрос был EDITED:

Нет никакого типа переменной auto в Java. Тот же цикл может быть достигнут как:

for ( Object var : object_array)
  System.out.println(var);

Java имеет локальные переменные, объем которых находится внутри блока, где они были определены. Подобно C и С++, но нет ключевого слова auto или register. Однако компилятор Java не позволит использовать неявно-инициализированную локальную переменную и даст ошибку компиляции (в отличие от C и С++, где компилятор обычно только предупреждает). Courtesy: Wikipedia.

Нет, в Java нет какого-либо основного типа-вывода, например С++. Был RFE, но это было закрыто как "Не исправить", причина была:

Люди извлекают выгоду из избыточности объявления типа двумя способами.     Во-первых, избыточный тип служит ценной документацией - читатели не     должны искать декларацию getMap(), чтобы узнать, какой тип     возвращается. Во-вторых, избыточность позволяет программисту объявить     тип и, следовательно, воспользоваться перекрестной проверкой, выполняемой компилятором.

Ответ 2

Java 7 представляет синтаксис алмазов

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

По сравнению со старым java

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

Критический читатель заметит, что этот новый синтаксис не помогает писать петли for в исходном вопросе. Это правильно и полностью преднамеренно. См. Другой ответ, который ссылается на базу данных Oracle.

Ответ 3

В Java 8 вы можете использовать вывод лямбда-типа, чтобы избежать объявления типа. Аналогом к примерам опроса будет:

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

оба из них также могут быть упрощены с использованием ссылок на методы:

object_array.forEach(System.out::println); 
object_array.forEach(ObjectType::do_something_that_only_this_particular_obj_can_do);

Ответ 4

Короче говоря, нет, нет автоматического типа. Если все, что вы делаете, это печать значения, вы можете просто ссылаться на значение как Object.

Ответ 5

Это не чистое Java-решение, но добавление библиотеки под названием lombok позволит магии, приведенной ниже, скомпилировать и работать очень похоже к auto ключевому слову в С++

List<String> strList = Arrays.asList("foo", "bar", "baz");
for (val s: strList){
    System.out.println(s.length());
}

Ответ 6

Возможно, Java 10 имеет то, что вы (и я) хотите, с помощью ключевого слова var.

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

Из Предложения JDK Enhancement 286