1
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>()ですか? この問題の答えはそれを解決します。

4

2 に答える 2

2

最初のケースでは、生の型New(ではなくNew<Integer, String>) を使用しているため、すべてのジェネリック型チェックが無効になっています。これは、古い (Java 1.4) コードの互換モードとして機能します。

于 2013-05-28T12:01:50.060 に答える
0

型パラメーターを指定しない場合、Java 1.4 との下位互換性により、"Object" が必要であると見なされます。また、これに関する警告が表示されます。

したがって、関数は次と同等です。

public static void main(String[] args){
    New c = new New();
    f(c.<Object, Object>map());
}

Map<Object, Object>そして、パラメーターMap<Integer, String>が期待される場所で値を使用しようとしているというエラーが表示されます。

注:Map<Integer, String>はのサブタイプではありませんMap<Object, Object>

于 2013-05-28T12:55:44.403 に答える