2016-07-07 8 views
2

私は、次の抽象クラスを持っている:サブクラスをスーパークラスJavaに適用することはできません。

public class AudioObject extends MyObject<PlayNowDescriptionItem> { 

    @Override 
    protected MyObject generate(PlayNowDescriptionItem item) { 
     //do something 
    } 
} 

PlayNowDescriptionItemがDescriptionItemを拡張して、次のサブクラスを持って

public abstract class MyObject<T extends DescriptionItem> { 

    protected abstract MyObject generate(T item); 
} 

。私はまた、オブジェクトを生成するためのファクトリクラスを持っています。

public class ObjectFactory { 

public MyObject generateCastObject(DescriptionItem item) { 
    if (item instanceof PlayNowDescriptionItem) { 
     return new AudioObject(context).generate(item); 
} 

私はPlayNowDescriptionItemがDescriptionItemの子であるので、これは正常に動作だろうと思ったが、私は次の行にエラーが発生します。

 return new AudioObject(context).generate(item); 

AudioObjectのPlayNowDecriptionItemは、DescriptionItemに適用できません。

誰でも私がここで間違っているのを見ることはできますか?

+3

'.generate((PlayNowDescriptionItem)item);'を明示的にキャストする必要があります。 –

+0

なぜ答えは受け入れられなくなったのですか? –

答えて

7

あなたはこのようPlayNowDescriptionItemにごDescriptionItemをキャストする必要があります:あなたはDescriptionItemのサブクラスを受け入れるように生成する方法を定義したよう

return new AudioObject(context).generate((PlayNowDescriptionItem)item); 

(クラスPlayNowDescriptionItemのオブジェクトは、クラスDescriptionItemの対象であることに注意してくださいしかし逆の場合は必ずしも有効ではありません。たとえば、PlayNowDescriptionItemではないサブクラスPlayAfterDescriptionItemである可能性があります。

関連する問題