public class ExplicitTypeSpecification {
static void f(Map<Integer, String> map){}
public static void main(String[] args){
New c = new New();
f(c.map());
}
}
class New <K, V>{
Map<K, V> map(){
return new HashMap<K, V>();
}
}
このコードはエラーなしでコンパイルされます。
次に、クラス New にいくつかの変更を加えます。
class New {
<K, V>Map<K, V> map(){
return new HashMap<K, V>();
}
}
メソッドだけをパラメータ化しましたmap()
が、クラス全体はパラメータ化していません。ただし、この場合、次の行でコンパイル エラーが発生f(c.map());
します。
java: f(java.util.Map<java.lang.Integer,java.lang.String>) in
Generics.ExplicitTypeSpecification.ExplicitTypeSpecification cannot be applied to
(java.util.Map<java.lang.Object,java.lang.Object>)*
明示的な型を指すことはできますが、コンパイル エラーが発生する理由にf(c.<Integer, String>map());
興味があります。.
どちらの場合も、メソッドはオブジェクトをmap()
返しMap<Object, Object>
ますが、最初のケースでは、未チェックの割り当ての警告が表示されます。
質問: 2 番目のケースで、より厳密な型チェックが行われるのはなぜですか?
new HashMap()
と newの違いは何HashMap<Object, Object>()
ですか? この問題の答えはそれを解決します。