2

私は次のクラスを持っています:

class MySelectBox {
    public MySelectBox(Provider<Map<? extends Object, ? extends Object>> providerArrayIdToLabel) {
        ...
    }
}

そして、私はこのクラスを使用するコードでこれを渡そうとしています:

new MySelectBox(new Provider<Map<Long, String>>{
    ... my implementation of Provider ...
});

コンパイラは次のエラーを出します。

The constructor MySelectBox(new Provider<Map<Long,String>>(){}) is undefined

なんで?メソッドが未定義なのはなぜですか?コンストラクターの署名を受け入れられるようにするには、何を変更する必要がありますかProvider<Map<Long, String>>

注:プロバイダーインターフェイスは次のとおりです。

public interface Provider<T> extends javax.inject.Provider<T> {
  T get();
}
4

4 に答える 4

5

MySelectBoxコンストラクターの宣言を次のように変更します。

public MySelectBox(Provider<? extends Map<? extends Long, ? extends String>> providerArrayIdToLabel) 
于 2012-12-15T14:52:28.857 に答える
2

答えを拡張するために、あなたのタイトルは間違っており、質問を反映していません。にを渡すことができます。それは問題ではありません。XとYが異なる場合(ここでXはとYは)、aをaに渡すことはできません。XがYのサブタイプであるかどうかは関係ありません。これは、StringがObjectのサブタイプであっても、に渡すことができないのと同じです。ただし、最上位でワイルドカードを使用すると、サブタイプを許可できるようになります。に渡すことができます。Map<Long, String>Map<? extends Object, ? extends Object>Provider<X>Provider<Y>Map<Long, String>Map<? extends Object, ? extends Object>Provider<String>Provider<Object>Provider<X>Provider<? extends Y>

于 2012-12-15T22:09:27.160 に答える
1

That's the effect of the Java generics being invariant.

Since that map is passed to the constructor, I think the best fix would be to declare the key and value types as class generics, so each instance will hold a map of specific keys and values:

class MySelectBox<K, V> {
    public MySelectBox(Provider<Map<K, V>> map) {}
}

Now you can safely write:

new MySelectBox<Long, String>(new Provider<Map<Long, String>>());
于 2012-12-15T15:04:39.533 に答える
0

コードを次のように変更します

    new MySelectBox(new Provider<Map<?, ?>>() {
        @Override
        public Map<Long, String> get() {
            return null;
        }
    });

これが私の説明の試みです(私もジェネリックに苦労しているので、これは間違っているかもしれません):

コンパイラーは、プロバイダーがオブジェクトを作成するだけであることを知りません。aは(のように)Provider<Map<?, ?>>のインスタンスを保持できるオブジェクトであると考えています。また、aは、キーとして何でも、値として何でも含むマップを保持できるはずなので、aは有効な型置換ではありません。実際、aはのインスタンスのみを保持できます。Map<?, ?>List<Map<?, ?>>Provider<Map<?, ?>>Provider<Map<Long, String>>Provider<Map<Long, String>>Map<Long, String>

于 2012-12-15T14:57:52.060 に答える