型推論アルゴリズムが最も具体的な型を見つけようとするのはなぜですか?

Why the type inference algorithm tries to find the most specific type?


質問 written by Geek @2013-02-26 06:56:08Z

: 6 : 1 : 184

型推論のオラクルのドキュメントから

型推論は、各メソッド呼び出しと対応する宣言を調べて、呼び出しを適用可能にする型引数を決定するJavaコンパイラの機能です。 推論アルゴリズムは、引数のタイプと、使用可能な場合、結果が割り当てられている、または返されるタイプを決定します。 最後に、推論アルゴリズムは、すべての引数で機能する最も具体的なタイプを見つけようとします。

この最後の点を説明するために、次の例では、推論はpickメソッドに渡される2番目の引数がSerializable型であることを決定します。

static <T> T pick(T a1, T a2) { return a2; }
Serializable s = pick("d", new ArrayList<String>());

なぜアルゴリズムは最も具体的なタイプを見つけようとしますか?

コメント 1

なぜいけないのですか?

written by デフォルトロケール @2013-02-26 07:01:13Z

コメント 2

@defaultlocaleこの質問に答える1つの方法は、なぜそうすべきではないのかを答えることです。どうしてそれがいけないのかわからないなら答えてください。喜んで受け入れます。

written by オタク @2013-02-26 07:02:37Z

コメント 3

メソッドがオーバーロードしない場合、オーバーロードなどはないからです-radai

written by @2013-02-26 07:05:07Z

コメント 4

@Geekあなたの質問を理解したかどうかわかりません。代替手段は何ですか?最も一般的な型を使用すると、常にjava.lang.Object

written by デフォルトロケール @2013-02-26 07:11:46Z

コメント 5

最も具体的なタイプを選択しない場合、何を選択する必要がありますか?それほど具体的ではないタイプが2つあるとします。どちらを選ぶべきですか?特定のタイプが見つからない場合にのみ、フォールバックメカニズムが必要です。

written by シヴァクマール @2013-02-26 07:13:19Z

回答 1 written by Javier @2013-02-26 07:13:37Z
5

なぜなら、この規則が適用されないと、割り当ての互換性により呼び出しがあいまいになるからです。

たとえば、最も具体的なタイプのルールが適用されない場合、 PrintStreamprint(Object)およびprint(String)定義しprint(Object) 。print print("bar")は、直感に反するprint( String )の代わりにprint( print(Object)呼び出すことができます。

型の選択はコンパイル時の型に基づいているため、次の例ではprint(Object)が呼び出されます。

PrintStream out = ...;
Object bar = "bar";
out.print(bar);
out.print((Object)"foo");