5

私はコードに直面しましたが、そのコンパイル結果は私にとって驚きでした。

public class Test3{
    public static<K,V> Map<K,V> map(){return new HashMap<K,V>();}
}



class A{

    static void f(Map<String,Integer> bcMap){}

    public static void main(String[] args){
        f(Test3.map()) //not valid
        Map<String,Integer> m = Test3.map();//valid

    }
}

メソッドに値を渡すと、メソッドの引数が渡された値に代入されることを意味すると常に思っていました。

間違った批准ですか?

4

1 に答える 1

10

修正:

の使用でTest3.map()は型引数が提供されず、コンパイラが型引数を推測する方法がありません。型引数の推測に失敗した場合、JLS は次のように言います。

Tまだ推論されていない残りの型変数は、 type を持つと推論されますObject

したがって、メソッド呼び出しは次のようになります

Map<Object, Object> object = Test3.map(); 
f(object); //not valid

これは、コンパイラからのエラー メッセージの内容によって確認されます。

互換性のない型:java.util.Map<java.lang.Object,java.lang.Object>に変換できませんjava.util.Map<java.lang.String,java.lang.Integer>

ジェネリック型引数のデフォルトはObjectです。

型引数を指定することで修正できます

f(Test3.<String, Integer>map()); // valid
于 2014-03-16T15:08:18.157 に答える