25

String関数の戻り値の型の場合に、コンパイラが型パラメーターを正しく推測できる理由。

public class Generics {
    private static List<String> function() {
        return new ArrayList<>();
    }
}

ただし、推論する型がメソッド パラメーターの場合は失敗します。

public class Generics {
    public static void main(String[] args) {
        method(new ArrayList<>());
    }    

    private static void method(List<String> list) {

    }
}

この場合のエラーは次のとおりです。

The method method(List<String>) in the type Generics is not applicable 
for the arguments (ArrayList<Object>)
4

2 に答える 2

16

これは、型推論がまだ期待どおりに機能しない場所の 1 つです。

残念ながら、その動作は完全に有効であり、準拠しています。

良いニュースは、Java 8には改善された型推論 (JEP 101)が含まれているため、このような状況は期待どおりにコンパイルされるはずです。

このようなジェネリック メソッド呼び出しの結果が別のメソッドに渡されたときに、コンパイラが型を推測できるようにすることは妥当と思われます [...]。

残念ながら、これは JDK 5/6/7 では許可されていません。プログラマが利用できる唯一のオプションは、明示的な型引数を使用することです。

直接的な改善 (つまり、ここで言及したような状況) とは別に、この変更は、Lambda (JEP 126)をより効率的に (つまり、多くの型情報を入力する必要なく) 使用できるようにするためにも必要です。

于 2013-03-15T15:29:09.830 に答える
6

JLS で未解決の型引数を推論するセクションはかなり複雑ですが、最初のケースのひし形は代入変換の対象となる場所で発生し、2 番目のケースではメソッド呼び出し変換で発生することを理解しています。異なるルールに従います。

于 2013-03-15T15:33:41.830 に答える