1. ホーム
  2. java

[解決済み] チェックされていない割り当ての警告

2022-02-01 14:26:48

質問

Android Studio 1.1.0を使用しています。

このため、警告は発生しません。

public static class A {
    public Map<Integer, String> getMap() {
        return null;
    }
}

public static class B {
    public void processA(A a) {
        Map<Integer, String> map = a.getMap();
    }
}

しかし A をジェネリックにする。

public static class A<T> {
    public Map<Integer, String> getMap() {
        return null;
    }
}

そしてこの行。

Map<Integer, String> map = a.getMap();

は警告が出るようになりました。 "Unchecked assignment: 'java.util.Map to java.util.Map<java.lang.Integer, java.lang.String>' .

の署名があっても getMap とは全く独立しています。 T の型に関して曖昧さはありません。 Map が含まれます。

を再実装することで警告を取り除くことができることは知っています。 processA を以下のように設定します。

public <T> void processA(A<T> a) {
    Map<Integer, String> map = a.getMap();
}

しかし、なぜそんなことをしなければならないのでしょうか?というのは T ということです。

そこで質問ですが、なぜタイプ消去は T (のインスタンスを渡しているのなら、それは理解できる。 A , T は未知数) だけでなく、以下のような一般的なシグネチャもハードコードされています。 <Integer, String> この場合は?

どのように解決するのですか?

2番目のケースで、あなたが行う場合。

public void processA(A a)

とはどういう意味ですか? A ? という意味でしょうか? A<String> または A<List<String>> または何ですか?の型に関連するものは何も使っていないかもしれません。 A しかし、コンパイラはこの事実を知りません。コンパイラにとっては、単に A はパニックの兆候です。

あなたの場合、特にAの種類を知る必要はないので、できます。

public void processA(A<?> a) {
    Map<Integer, String> map = a.getMap();
} 

引数の型が A<?> の型は特に気にしないということです。 A で、ワイルドカードを指定するだけです。あなたにとって、これは A で、その総型として任意の型を指定することができます。実際には、型がわからないということです。に関連することは何もできないので、役に立たない。 A と同じようにタイプセーフで ? は、事実上何でもありです

しかし、あなたのメソッド本体と同じように、このメソッドで A<?> なぜなら、本文中のどこにも、実際に A