2013-04-21 1 views
63

C++のように、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ループがあることを知っているが、自動車はありますか?もしそうでなければ、これを行うためのハックはありますか?私はC++ 11の新機能を参照しています。

+0

から

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

基本型を除くすべてがタイプ 'Object'の変数に割り当てることができますので、一部の操作のために、あなたは' auto'をしたい 'Object'を使用することができます。 –

+1

javaにはそのような変数がありません –

+0

@ Zyx2000:オブジェクトの 'to_string'関数を使用しますが、実際のオブジェクトではないでしょうか? –

答えて

22

。同じループは次のようにして実現できます。

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

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

いいえ、C++のようなJavaでは主流の型推論はありません。そこRFEましたが、これは、「修正されません」と閉鎖された、与えられた理由があった。

人間は2つの方法で型宣言の冗長性の恩恵を受ける。 最初に、冗長タイプは貴重なドキュメントとして役立ちます。 は、 が返すタイプを見つけるためにgetMap()の宣言を検索しなければなりません。第2に、冗長性は、プログラマが意図した 型を宣言することを可能にし、それによってコンパイラによって実行されるクロスチェックの恩恵を受ける。

+0

Trueですが、Objectは実際のオブジェクトの代わりに 'to_string'関数を使用しませんか? –

+9

@GamesBrainiacいいえ、メソッド呼び出しはJavaでは常に多態的です。しかし、他の多くのこと(例えば、オーバーロード解決、または 'Object'で定義されていない操作)は、このようにすることはできません。これは本当に良い答えではありません。問題の例が弱いために働くことがあります。 – delnan

+1

その後、元のタイプにキャストする必要があります。 – NINCOMPOOP

8

要するに、いいえ、オートタイプはありません。あなたがしているすべてが値を印刷しているのであれば、その値をObjectとして参照することができます。

んが、Javaで何auto変数の型が存在しない:質問が編集はませんでした前に回答

+0

または 'hashCode'sを計算する、またはクラス名を集める、または...あなたが考えている;)リストは短いですが。 [Object class 'docs](http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html)を参照してください(初心者向けのコメント、SimonCを知っていると確信しています) –

20

のJava 7には、古いJavaのに比べて、diamond syntax

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

を紹介

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

重要な読者は、この新しい構文はのために書いて助けていないことがわかります元の質問のループ。それは正しいと思われ、完全に意図されているようです。オラクルのバグ・データベースを引用している他の回答を参照してください。

+2

真実ですが、彼(と私)が探しているものは次のようなものです: 'auto integerBox = new Box ();'、これは通常、 'HashMap < String、LinkedList >> –

+1

この問題は、コードサンプルの後で私が扱ったものです。結論は、Javaはそれをしていないということでした。 – Tarrasch

14

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

それはしかしlombokと呼ばれるライブラリを追加し、純粋なJavaソリューションではありませんが有効になりますC++でのautoキーワードに似て非常にコンパイルして動作するように以下の魔法

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

はJavaの10なるかもしれませんトン、あなた(と私が)欲しいものがありますvarキーワードを使用してください。 JDK Enhancement Proposals 286

+0

改善されましたが、そのキーワードはローカル変数でのみ機能します。 C++オートタイプの推論ほど強力ではない – texasbruce

関連する問題