web-dev-qa-db-ja.com

Javaに自動型推論はありますか?

C++にあるようなJavaにauto変数型がありますか?

例:

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の新機能について言及しています

91
Games Brainiac

質問が編集される前に答えた

Javaにはauto変数型はありません。同じループを次のように実現できます。

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

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

いいえ、C++のようなJavaには主流の型推論はありません。 RFE がありましたが、これは「修正できない」としてクローズされました。理由は次のとおりです。

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

35
NINCOMPOOP

Java 10には、varキーワードを使用して、あなた(および私)が望むものがあります。

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

From JDK Enhancement Proposals 286


更新:うん、その機能はJava 10リリースになりました!

43

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

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

古いJavaと比較して

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

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

24
Tarrasch

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

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

8
SimonC

純粋なJavaソリューションではありませんが、 lombok というライブラリを追加すると、C++のautoキーワードと非常によく似た以下のマジックがコンパイルおよび動作できるようになります。

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