141

autoC++ にあるような変数の型は 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 ループがあることは知っていますが、auto はありますか? そうでない場合、これを行うためのハックはありますか? C++11 の新機能について言及しています。

4

6 に答える 6

65

Java 10 では、varC++ のような識別子が導入されましたauto申し訳ありませんmisjacksonの答えを参照してください。

autoJava 10 より前は、キーワードに相当するものはありませんでした。同じループは次のように実現できます。

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

Java にはローカル変数があり、そのスコープは定義されたブロック内にあります。C および C++ に似ていますが、auto または register キーワードはありません。ただし、Java コンパイラーは、明示的に初期化されていないローカル変数の使用を許可せず、コンパイル エラーを発生させます (コンパイラーが通常警告のみを出す C および C++ とは異なります)。礼儀:ウィキペディア

Java には C++ のような主流の型推論はありませんでした。RFEがありましたが、これは「修正しない」として閉じられました。与えられたのは:

人間は、型宣言の冗長性から 2 つの点で恩恵を受けます。まず、冗長な型は貴重なドキュメントとして機能します。読者は getMap() の宣言を検索して、返される型を見つける必要はありません。第 2 に、冗長性により、プログラマーは目的の型を宣言できるため、コンパイラーが実行するクロス チェックの恩恵を受けることができます。

于 2013-04-21T15:28:23.373 に答える
26

Java 7 はダイヤモンド構文を導入します

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

昔のJavaと比べて

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

批判的な読者は、この新しい構文が元の質問の for ループの記述に役立たないことに気付くでしょう。それは正しく、完全に意図的であるようです。Oracleのバグデータベースを引用している他の回答を参照してください。

于 2013-07-31T22:48:36.107 に答える
18

Java 8 では、ラムダ型推論を使用して型の宣言を回避できます。質問者の例に類似するものは次のとおりです。

object_array.forEach(obj -> System.out.println(obj)); 
object_array.forEach(obj -> obj.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);
于 2016-05-09T16:37:34.163 に答える
7

要するに、いいえ、自動タイプはありません。ただし、値を出力するだけの場合は、値を として参照できますObject

于 2013-04-21T15:25:07.100 に答える