2012-03-16 7 views
2

javase api docsを読んで、コレクションフレームワークのメソッドのほとんどすべてが山括弧を使用していることに気付きました。たとえば、次のようになぜ言語デザイナーはかっこの代わりに角かっこを使用しましたか?

Collection<String> c = new HashSet<String>(); 

または

Map<String, Integer> m = new HashMap<String, Integer>(); 

彼らは括弧のセットと同じ機能を果たすように見えるの目に。私は依然として、山括弧が使われている重要な接続と、それがなぜそうであるのかを知るには、Java言語が十分にわかりません。

私の質問は具体的には:山括弧がperensではなくJVMによって解釈される方法には意味がありますか?それとも、複数の言語にわたる一般的なプラクティスですか?

+1

「C++」で最初に紹介された場所で覚えていれば、解析に問題があり、他の記号があいまいさを引き起こしていました。 –

+0

仕様で説明されていない限り、言語設計者に尋ねる必要があります。この特定のケースでは、答えはかなり明白ですが、このような一般的な質問はかなり無意味です。 – EJP

答えて

8

角括弧は、これは、既存の言語に後から追加されたので、私は方法(選択した既存の括弧に明確な区別を作るために角括弧を推測するJava 1.5でのジェネリック医薬品の導入

に来て、コンストラクタ呼び出し)、角括弧(配列メンバアクセス)、中括弧(ブロックデリミタ)私は角括弧が論理的な選択ここにあると思います。

+3

それはC++が使用したものなので選択されました:) –

+1

@MiserableVariableもちろん当てはまります –

+0

でも、私のバージョンはまだ意味をなさないのですが、それはC++、Javaではなく:-) –

3

山括弧は、 でperensとは対照的に解釈される意味にはありますか?それらの

いずれも、JVMがあるので [ブレース、またアングルブラケットも〕、括弧及び角ブラケットの両方が、コンパイル時に解析され、そしてJVMがそれらを見ていないJVMによって解釈されません実行時にアクティブになります。サイドノートとして

  1. <>genericsために使用され、そしてそれらの使用はまた、C++のような他の言語では一般的です。

  2. new HashSet<String>();をメソッドとして参照していますが、それはコンストラクタを呼び出すことではありません。コンストラクタはメソッドではありません。

+0

'コンストラクタはメソッドではありません.'私はそれに同意できないと思います。コンストラクタは特別な種類のメソッドです。 –

+0

@SeanPatrickFloyd:この点はあいまいだと思いますが、Javaの仕様では、[メソッドとコンストラクタの宣言](http:// "method")だけでなく、 "method and constructor" /docs.oracle.com/javase/specs/jls/se7/html/jls-13.html#jls-13.4.12) – amit

+0

@SeanPatrickFloyd:まだ決定的ではありませんが、より有益です。[章8 - クラス](http: //docs.oracle.com/javase/specs/jls/se7/html/jls-8.html): 'コンストラクタ(8.8)はメソッドに似ていますが、メソッド呼び出しでは直接呼び出すことはできません。新しいクラスインスタンスを初期化するために使用されます。メソッドと同様に、オーバーロードされる可能性があります(§8.8.8)。 '。 **これはまだ決定的ではありません** - コンストラクタとメソッドには類似点がありますが、コンストラクタはメソッドではありません。 – amit

3

かっこは、メソッド呼び出しと式グループ化のために予約されています。角括弧はジェネリック型パラメータに使用されます。

両方に括弧が使用されていた場合、コンパイラではなく、少なくとも読者にとって曖昧なものになる可能性があります。 Javaでは

+1

+ 1の簡潔さ。 _ambiguous_を意味しましたか? – paislee

+0

それはJavaの文法に敏感なものになりそうですが、それは確かにあなたの言語に欲しいものではありません(しかし、C++の人たちはその問題を抱えています) – Voo

+0

@paislee:はい。編集されました。 – tdammers

0

、角括弧は、渡された種類に応じて異なる意味を有するタイプであるジェネリック型の使用を示す。

ジェネリック最も単純なユースケースは、に、特殊なコレクションであります特定のタイプのオブジェクトだけを保持する必要があることを示します。

Javaでは、ジェネリックスは実行時に基本的な強制機能を除いて実際には多くの言語を追加しません。コレクションに挿入またはコレクションから取得されたオブジェクトは、実行時に指定された型に自動的にキャストされます(最悪の場合はClassCastExceptionの危険性があります)。言語仕様のジェネリック型のコンパイル時チェックはありません。

0

多角形(「ジェネリック」)クラスおよびメソッドの場合は、タイプのパラメータリストを表すために角かっこを使用します。これらは、値のパラメータリスト(括弧内のもの)とは非常に異なる獣です。それらが同じであれば、式new Foo(bar)があると想像してください...パーサーはこれをどのように解釈しますか? barは、変数のタイプまたは名前の名前ですか?

3

intからvoidのように、C++で使用されているので、Javaで使用されていると思います。 C++ templates: the complete guide By David Vandevoorde, Nicolai M. Josuttis, page 139から

比較的早いテンプレートの開発中に、トムPennello- 広く認識解析の専門家が のMetaware-指摘し、いくつかのために働いて、部分的にはかかわらず、いくつかの興味深い参照を発見

山括弧に関連する問題Stroustrupはまた[DnE]のそのトピックについて をコメントし、人間はかっこではなく角括弧 を読むことを好むと主張する。しかし、 とPennelloは、 (Dallasで開催された)のC++標準会議で中括弧(特にList {::X})を提案していました。その時点では、 のテンプレート 内にネストされた他のテンプレート - いわゆるネストされたテンプレート - は有効ではないため、 132ページのセクション9.3.3の説明はほとんど無関係でした。として 結果。委員会は、角度 を角括弧に置き換える提案を拒否した。ビャーネ・ストロヴストルップは、彼らがより良いと思っていたので

だから私は、おそらく彼らは、プログラマを支援するために使用された、角括弧は、パーサーを支援するために使用されたことを誤解している可能性があります。

+1

私はスカラーのデザイナーがジェネリックのためにそれらの醜い角括弧を選ぶ理由をここで見つけました。人間として私はStoustrupが正しいことを確認します。美しさftw ... – user2418306

+0

@ user2418306、同じ理由、関連するものが見つかった場合は、リンクを共有してください:-)。 – greenoldman

0

C++でテンプレートの代わりに<>の代わりに()を使用したとします。今、このコード行を考えてみます。

  1. は、型が型引数barとテンプレート型fooへのポインタであるローカル変数の宣言bang

    foo(bar)*bang; 
    

    のことですか?

  2. fooを呼び出し、barを渡してから、結果にbangを掛けます。

文法的にあいまいです。文法を微調整して、常に一方を優先するように調整することができますが、それは(すでに痛いほど複雑な)文法をより毛深くします。さらに悪いことに、どの方法で選択しても、ユーザーはたぶん間違っていると推測されます。

したがって、C++では、テンプレートに異なるグループ化文字を使用するのが理にかなっています。

Javaは、C++の足音のちょうど後に続きます。

ここでの問題の大部分は、Cが変数宣言のための明示的な構文を持たず、代わりに型の注釈を使用して暗黙的に "その型の新しい変数を作る"ことを意味します。変数の明示的なキーワード(varval)を持つScalaのような言語は型宣言の構文が自由になります。そのため、genericsには[]を使用できます。

関連する問題