2016-07-07 12 views
2

Ich habe folgende abstrakte Klasse:Unterklasse kann nicht auf Super-Klasse Java angewendet werden.

public abstract class MyObject<T extends DescriptionItem> { 

    protected abstract MyObject generate(T item); 
} 

, die folgende Unterklasse hat:

public class AudioObject extends MyObject<PlayNowDescriptionItem> { 

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

PlayNowDescriptionItem erstreckt DescriptionItem. Ich habe auch eine Fabrikklasse zum Erzeugen von Objekten.

public class ObjectFactory { 

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

dachte ich, dass dies funktionieren würde, weil PlayNowDescriptionItem ein Kind DescriptionItem ist, aber ich erhalte eine Fehlermeldung in der folgenden Zeile.

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

PlayNowDecriptionItem in AudioObject kann nicht auf DescriptionItem angewendet werden.

Kann jemand sehen, was ich hier falsch mache?

+3

Sie müssen explizit einwerfen: '.generate ((PlayNowDescriptionItem) item);'. –

+0

Hei warum wird die Antwort nicht mehr als akzeptiert markiert? –

Antwort

7

Sie benötigen DescriptionItem-PlayNowDescriptionItem so werfen:

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

, wie Sie das generieren Methode definiert beachten Sie, eine Unterklasse von DescriptionItem (bitte zu akzeptieren, dass ein Objekt der Klasse PlayNowDescriptionItem ist auch ein Objekt der Klasse DescriptionItem aber das Gegenteil ist nicht immer gültig, zB könnte eine Unterklasse sein PlayAfterDescriptionItem das ist kein PlayNowDescriptionItem)

Verwandte Themen