Есть ли автоматический тип вывода на 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