16

私は Oracle OTN Virtual Event: Java SE and JavaFX 2.0 (2012 年 2 月 28 日) を見て、新しいダイヤモンド演算子 (そのMap<String, List<String>> myMap = new HashMap<>();こと) について話しているときに、講演者は、実装は思ったほど簡単ではないと述べました。簡単なトークンの交換。

私の質問はなぜですか?単純に変数の宣言から文字列を取得し、それをダイヤモンド演算子に入れるように実装できないのはなぜですか?

4

2 に答える 2

14

私もそれを実装していないので、推測することしかできません。

しかし、通常、これらが見た目よりも複雑な理由は、最初の検査で最も一般的な (または最も公表された) ユース ケースのみを調べるためです。この場合、それはあなたが言及したものです。理論的には、正確に指定するのは簡単で、コンパイラで実装するのはかなり簡単です。

ただし、ひし形演算子 (ちなみに、技術的には演算子ではありません) は、さまざまな方法で使用することもできます。

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

そのような場合、単純なトークン置換は明らかに機能しなくなり、実際の型分析を含む実際の型推論が必要になります (つまり、単純なトークン置換とはまったく異なる抽象化レベルになります)。

于 2012-03-01T08:00:56.173 に答える
2

Java が行わない (多くの言語にある) ものは、使用法に基づく暗黙の型です。つまり、Java は、その使用方法に基づいて必要な型を意味するわけではありません。

例えば

 Type a = b;

の型aと の型は独立しており、 の型に基づくb仮定は行われません。ba

MethodHandles は、これをサポートする兆候を示しています。戻り値の型はコンテキストに基づいて使用できますが、これは実行時の機能です。

結論として、私の仮定は次のとおりです。言語はそのようなものをサポートしていなかったため、Java で実装するのは困難でした。言語がこのような機能を常に使用している場合、取るべきアプローチは (どのように機能するかの仕様を定義するという点で) 理解され、コンパイラーのツールによってサポートされます。

于 2012-03-01T08:26:50.997 に答える