2012-03-01 14 views
16

オラクルのOTN仮想イベント:Java SEとJavaFX 2.0(2012年2月28日)を見て、新しいダイヤモンドオペレータ(そのMap<String, List<String>> myMap = new HashMap<>();もの)について話していたが、スピーカーは、単純なトークンの置換ではありません。Java 7のダイヤモンド演算子:なぜ実装が難しいのですか?

私の質問はなぜですか?変数の宣言から文字列を取り出してダイヤモンド演算子に入れるだけでは、なぜこれを実装できませんか?

+3

Upvoted。なぜこのためにオペレータが必要なのでしょうか? – Croo

答えて

14

私はそれを実装していないので、私は推測できます。

通常はこれらのことは、最初の検査では最も一般的な(または最も一般化された)ユースケースのみを調べるという理由より複雑です。この場合、それはあなたが言及したものです。理論上、正確に指定するのは簡単で、コンパイラで実装するのは簡単です。しかし、(技術的な方法によって、オペレータ、ではない)ダイヤモンド演算子は、同様に様々な方法で使用することができ

someMethodWithGenericArguments(new HashMap<>()); 
new SomeGenericClass(new HashMap<>()); 
T foo = new SomethingRelatedToT<>(); // where T is a generic type parameter 

ような場合には、明らかに、単純なトークンの交換は、もはや動作しますが、あなたは実際のタイプの推論を必要とします(つまり、単純なトークンの置き換えとは全く異なる抽象化レベルにあります)。

+0

ありがとう、私はこれらが本当に複雑な状況であることを知っています。最初のケースは 'someMethodWithGenericArguments()'が˙Map˙と 'Map 'でオーバーロードされている場合の質問を提起します。私にはまったくあいまいなようです。 – jabal

+0

@ジャバル:試してみてください! 'Map 'と 'Map 'は同じ消去( 'Map')を持っているので、一つのメソッドの二つのオーバーライドを持つことはできません。 –

2

Javaがしないもの(多くの言語が持つ)は、使用法に基づいて暗黙の型です。すなわち、Javaは、それがどのように使用されるかに基づいて要求タイプを暗示するものではない。

Type a = b; 

aの種類とbのタイプは独立しており、何の仮定はaの種類に基づいて、約b行われません。

メソッドハンドリングは、これをサポートする兆候を示しています。戻り値の型はコンテキストに基づいていますが、これは実行時の機能です。結論として、私の前提は次のとおりです。言語がそれをサポートしていなかったので、Javaで実装するのは難しかったです。使用されている言語がこのように常に使用されている場合、どのように動作するべきかの仕様を定義するという意味で理解し、コンパイラのツールでサポートされるアプローチを理解する必要があります。

+3

不思議なことに、*メソッド呼び出しのジェネリック型引数*のコンパイラ*はすでに型推論をサポートしています。しかし、*オブジェクトのインスタンシエーション*では、その機能はDiamond Operatorでのみ追加されました。 –

関連する問題