3

ファクトリを作成しようとしています (文字列パラメーターから新しいインスタンスを生成します)。

Monster クラス (スーパークラス) と Robot1 クラス (Monster を拡張) があります。

私の工場は宣言します:

private static final ImmutableMap<String, Class<? extends Monster>> DISPATCHER = ImmutableMap.of("robot1", Robot1.class);

しかし、私は得る:

Type mismatch: cannot convert from ImmutableMap<String,Class<Robot1>> to ImmutableMap<String,Class<? extends Monster>>
4

4 に答える 4

6

やれば十分

private static final ImmutableMap<String, Class<? extends Monster>> DISPATCHER = 
   ImmutableMap.of("robot1", (Class<? extends Monster>) Robot1.class);

Java は、そうでない場合でも、可能な限り具体的な型が必要であると想定する傾向があります。このアップキャストは完全に安全であるため、警告は発生しません。より一般的な型が必要であることを Java コンパイラに伝えるだけです。

于 2012-10-24T16:48:56.523 に答える
2

これは、実際には ではないMonsterの代わりに のサブタイプを使用できるためです。したがって、コンパイラは、より具体的な型パラメーターを持つインスタンスへの型パラメーターとしての参照を許可しません。これは、実行時に失敗する可能性があるためです。Class<? extends Monster>RobotClass<? extends Monster>

EG の場合: - Class<? extends Monster>実際には にすることができますがClass<Zomby>、もちろんClass<Robot>変換することはできません。Class<Robot>これが、暗黙的にキャストできない理由ですClass<? extends Monster>

これは、次のことができない場合に似ています。

List<Animal> dogList = new ArrayList<Dog>();

繰り返しになりますが、 には任意のタイプの動物を追加できるdogListため、RHS でより具体的なタイプ パラメータを指定することはできません。

  • このチェックはコンパイル時にのみ行われ、コンパイラはこれが実行時に失敗する可能性があることを確認しているため、これを許可しません。
于 2012-10-24T16:27:32.810 に答える
2

問題は、キャストできないRobot1.classあなたを返すことですClass<Robot>Class<? extends Monster>

したがって、そのような場合には特定のキャストを追加する必要があります。

ImmutableMap<String, Class<? extends Monster>> DISPATCHER = 
 (ImmutableMap<String, Class<? extends Monster>>)(ImmutableMap<?, ?>)ImmutableMap.of(
                                                        "robot1", Robot1.class);
于 2012-10-24T16:27:48.907 に答える
1

キャストなしでうまく機能する方法を見つけました:

private static final ImmutableMap<String, Class<? extends Monster>> DISPATCHER;

static {
    ImmutableMap.Builder<String, Class<? extends Monster>> builder = ImmutableMap.builder();
    // Monsters types list
    builder.put("robot1", Robot1.class);        

    DISPATCHER = builder.build();
}
于 2012-10-25T09:25:23.210 に答える