1
Class X{
   Class<B> object;
   public setObject( Class<B> a ){....}
}

Interface B{}
Interface C extends B {}

このように X をインスタンス化します。

X x = new X();
x.setObject( C.class );

コードをビルドすると、 required Class<B>foundと不平を言いますClass<C>。C は B を拡張するので、C.class を使用できませんか? もしそうなら、誰かが理由を説明できますか?

Spring の XML ベースの Bean を使用して同じことを行い、問題なく動作します。Bean の定義は次のようになります。

<bean id="dummy" class="X">
<property name"object" value="C">
</bean>

これはうまくいきます。Java でのインスタンス化が失敗する理由がわかりません。

4

3 に答える 3

1

List<Dog>が に代入できないのと同じように、List<Animal>が のサブタイプであっても、はClass<C>に代入できません。Class<B>CB

XML 構成を使用すると、すべてのタイプ セーフ規則が無視されます。あたかも生の型を使用しているかのように、パラメーター化された型の使用がすべて消去されたかのようです。AClass<C>は になり、Classa は にClass<B>なりClassます。AClassは a に割り当て可能Classです。

于 2014-10-31T23:18:17.160 に答える
0

これは有効な Java コードではありません

パラメータ<>に対して型消去が行われるため、機能します

Java バイトコードは、

class X{
   Class object;
   public void setObject( Class a ){....}
}

interface B{}
interface C extends B {}

型チェック情報が失われ、コンパイル時にのみ使用されます。

これを使用して、コードで機能させることができます。

class X{
   Class<? extends B> object;
   public void setObject( Class<? extends B> a ){....}
}

interface B{}
interface C extends B {}
于 2014-10-31T23:19:11.713 に答える
0

パラメータを取らないのと同じ理由で、パラメータをsetObject(Class<B>)取らないのが普通です: は のサブクラスですが、 のサブクラスではありません。Class<C>someMethod(List<Object>)List<Integer>List<Integer>List<Object>IntegerObject

これを機能させるには、メソッド シグネチャを次のように変更します。

public setObject(Class<? extends B> a) {....}
于 2014-10-31T23:19:05.303 に答える