本当の非ジェネリック環境で型推論をするのはあまり意味がありません。そうしないと、あなたとコンパイラは型をすでに知っていて、コンパイラが何かを干渉する必要はないからです。 しかし、私が見つけることができる終了例は約Target Types
です。ドキュメントから
この
void processStringList(List<String> stringList) {
// process stringList
}
として宣言されている方法を取ると、何のターゲットが指定されていない場合、それはスローされます、あなたはList<Object
を返してCollections.emptyList()
ので、この
processStringList(Collections.emptyList());
でそれを呼び出しますエラー
List<Object> cannot be converted to List<String>
ここでコンパイラはablではありませんeを入力してList<>
の型引数を干渉させます。
processStringList(Collections.<String>emptyList());
などのターゲットタイプを明示的に指定する必要がありますが、それ以上は必要ではありません。 Oracle docs Type Inference
これはもはや必要なJava SE 8ターゲット・タイプは、このような方法のprocessStringListへの引数としてメソッドの引数を含むように拡張されたものであるという概念ではありません。この場合、processStringListにはList型の引数が必要です。メソッドCollections.emptyListはListの値を返します。したがって、ターゲット型のListを使用すると、コンパイラは型引数Tの値がStringであることを推測します。このように、JavaのSE 8で、次の文は、コンパイルされます。
だから、最後の例では、コンパイラはCollections.emptyList()
からList<String>
を取得するための型引数を妨げます。
興味深い質問です。しかし、私はアルゴリズムがJavaのクラスの多態性のために毎回使われていると思います。 – KarelG