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


есть auto тип переменной в Java, как у вас в C++?

пример:

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, но есть ли авто? Если нет,есть ли хак для этого? Я имею в виду новую функцию в C++11

6 71

6 ответов:

ответил До того, как вопрос был редактировать:

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

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

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

нет, нет никакого основного вывода типа в Java, как C++ . Там был RFE но это было закрыто как "не исправит", причина дана была:

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

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

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

по сравнению со старой java

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

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

может быть Java 10 имеет то, что вы (и я) хотим, через var ключевое слово.

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

С предложения по улучшению JDK 286


обновление: Yap, эта функция попала в выпуск Java 10!

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

это не чистое решение на Java, однако добавление библиотеки под названием Ломбок позволит магии ниже, чтобы скомпилировать и работать очень похоже на auto ключевое слово в C++

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