Generics casten



  • Hallo,
    ich habe drei Interfaces, die von einem bestimmten Interface abgeleitet sind:

    public interface CADExportInterface extends InternalToolInterface ...
    public interface CADImportInterface extends InternalToolInterface ...
    public interface ImageExportInterface extends InternalToolInterface ...
    

    Ich übergebe einer Methode drei Listen, die jeweils einen Typ des Interfaces enthalten (also CADImportInterface, CADExportInterface und ImageExportInterface). Daher nehme ich das Hauptinterface (InteralToolInterface) entgegen:

    private JScrollPane create(ArrayList<InternalToolInterface> availableTools)
    

    Das Problem ist allerdings, dass ich im Aufruf der Methode "create" nicht Listen vom Typ "InternalToolInterface" reinstecke, sondern nur die etwas spezialisierteren Listen in der Hand habe (also z. B. ArrayList<CADExportInterface>).

    Probleme:

    ArrayList<CADExportInterface> tools = new ArrayList<CADExportInterface>();
    ...
    create(tools);
    

    => The method create(ArrayList<InternalToolInterface>) in the type ImAndExporterDialog is not applicable for the arguments (ArrayList<CADExportInterface>)

    ArrayList<CADExportInterface> tools = new ArrayList<CADExportInterface>();
    ...
    create((ArrayList<InternalToolInterface>)tools);
    

    => Cannot cast from ArrayList<CADImportInterface> to ArrayList<InternalToolInterface>

    Wie kann man Generics casten, bzw eigentlich müsste doch kein Cast notwendig sein, da ich die etwas spezielles reinstecke, aber das Basisinterface abfrage.

    Vielen Dank und viele Grüße



  • Du hast es offensichtlich noch nicht so ganz verstanden mit den Generics. InternalToolInterface ist Basisklasse von CADExportInterface , CADImportInterface & ImageExportInterface und erlaubt dir, zwischen diesen Typen zu casten. Eine ArrayList<CADExportInterface> ist jedoch kein ArrayList<InternalToolInterface> ; es sind zwei verschiedene Typen, hervorgegangen aus der Instanzierung eines Generics. Casten kannst du also zwischen den beiden nicht - du kannst wenn überhaupt nur die Elemente der ArrayList<...> s casten.

    MfG



  • Hallo,
    vielen Dank für deinen Hinweis. Du hast recht, ich habe es noch nicht ganz verstanden, weil ich erst seit vorgestern etwas mit Java v1.5 zu tun habe. Was allerdings auch hilfreich gewesen wäre, wäre mir zu zeigen, dass man es auch so hätte machen können (habe ich mittlerweile herausgefunden):

    private JScrollPane create(ArrayList<?> availableTools)
       InternalToolInterface internalToolInterface = (InternalToolInterface)availableTools.get(0);
    

Log in to reply