Ein kurzer Rant zu Javas angeblicher Typenstarre und die Methodenüberladung

  • Java
    public MyDialogFragment(List<InputStream> inputStreams) {}
    public MyDialogFragment(List<String> fileNames) {}


    WENN Java so unglaublich typenstarr ist wie jeder behauptet, warum meint es dann, dass List<InputStream> dasselbe sei wie List<String>?
    Weil das Ding zu List<T> umgebaut wird und List<T> mit List<T> identisch ist, fein.


    Und wie baue ich nun Konstruktoren, die unterschiedliche Typen von Listen aufnehmen können?

    Java
    public MyDialogFragment(List<InputStream> inputStreams) {}
    public MyDialogFragment(Collection<String> fileNames) {}


    Unglaublich konsistent und supereinfach zu lesen/verstehen/debuggen – nicht.
    Vor Allem wenn da noch mehrere Optionen hinzu kämen... Ich kann ja noch einmal auf ArrayList<URL> spezialisieren, doch was mach ich bei einer Liste von Ressource-IDs (gut, in einen Stream wandeln) oder File oder URI ?


    Dafür wäre ein MyDialogFragmentWithNames(List<String>) und ein MyDialogFragmentWithStreams(List<InputStream>) die perfekte Lösung.
    Gibbet in Java nur leider nicht. Also was mach ich nu?

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Funktioniert übrerladen vielleicht mit array statt list oder collection? Also String[] oder InputStream[]? Da hasst du mit Arrays.asList(..) schnell wieder eine Liste draus.


    Ansonsten Konstruktor privat und mit static factory methoden arbeiten, ala
    public static MyDialogFragment createFromStreams(..)
    oder so :)

  • Ja, das funktioniert tatsächlich.
    Danke für den Tipp. :)


    Ist nur ein bisschen Herumgewandle, das geht in Ordnung.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!