Hi,
ich benutze einen Supplier, der hauptsächlich ein Array eines beliebigen Typs zurück liefern soll, welches ich als Parameter für die Methode
Da ich allerdings Supplier verschiedener Typen (mal String, mal Integer, oder mal zusammen) in Unterklassen zusammenbaue, wäre es schön, einen Allround-Supplier zu haben, damit ich den Supplier in die Hauptklasse (abstract class) packen kann, denn der Methoden-Aufruf zum zusammenbauen der Strings bleibt ja der gleiche.
So würde es ja funktionieren:
Das Resultat list
Wenn ich aber den Supplier wie folgt austausche
fliegt eine Exception:
Was auch verständlich ist, denn Object!=Integer.
Die Idee ist halt, dass ich in meiner Hauptklasse die abstrakte Methode A nicht mehr abstrakt mache, sondern voll implementiert schreiben kann, um auf Basis des Suppliers X und der Parameters (String-Text mit "%s, %d") Y einen neuen Text Z zu erzeugen. Derzeit überschreibe ich die abstrakte Methode A in jeder Unterklasse und der Aufruf in jeder Unterklasse ist immer 1:1 der gleiche, lediglich die Supplier-Typen und Parameter unterscheiden sich von Unterklasse zu Unterklasse. Deshalb würde ich gerne in der Hauptklasse eine Referenz auf den aktuellen Supplier und Parameter halten und dann anschließend die Methoden der Hauptklasse aufrufen (die ja dann nicht mehr abstrakt, sondern implementiert wäre).
Versteht ihr was ich meine?
ich benutze einen Supplier, der hauptsächlich ein Array eines beliebigen Typs zurück liefern soll, welches ich als Parameter für die Methode
verwende.String.format(String s, Object ... args)
Da ich allerdings Supplier verschiedener Typen (mal String, mal Integer, oder mal zusammen) in Unterklassen zusammenbaue, wäre es schön, einen Allround-Supplier zu haben, damit ich den Supplier in die Hauptklasse (abstract class) packen kann, denn der Methoden-Aufruf zum zusammenbauen der Strings bleibt ja der gleiche.
So würde es ja funktionieren:
Code:
public class Test {
private static Supplier<Integer[]> params1 =
() -> new Integer[] { getScoreHome(), getScoreTotal() };
private static final String s1 = "Hallo, %d %d";
public static void main(String[] args) {
Test t = new Test();
System.out.println(String.format(s1, params1.get()));
}
public static Integer getScoreHome() {
return 2;
}
public static Integer getScoreTotal() {
return 11;
}
}
Das Resultat list
Hallo, 2 11
Wenn ich aber den Supplier wie folgt austausche
Code:
Supplier s = params1;
System.out.println(String.format(s1, s.get()));
fliegt eine Exception:
java.util.IllegalFormatConversionException: d != [Ljava.lang.Integer;
at java.util.Formatter$FormatSpecifier.failConversion(Unknown Source)
at java.util.Formatter$FormatSpecifier.printInteger(Unknown Source)
at java.util.Formatter$FormatSpecifier.print(Unknown Source)
at java.util.Formatter.format(Unknown Source)
at java.util.Formatter.format(Unknown Source)
at java.lang.String.format(Unknown Source)
at com.agfa.orbis.tools.rwam.converter.amb.ebm2009.model.mapping.obj.buildPatt.Test.main(Test.java:20)
Was auch verständlich ist, denn Object!=Integer.
Die Idee ist halt, dass ich in meiner Hauptklasse die abstrakte Methode A nicht mehr abstrakt mache, sondern voll implementiert schreiben kann, um auf Basis des Suppliers X und der Parameters (String-Text mit "%s, %d") Y einen neuen Text Z zu erzeugen. Derzeit überschreibe ich die abstrakte Methode A in jeder Unterklasse und der Aufruf in jeder Unterklasse ist immer 1:1 der gleiche, lediglich die Supplier-Typen und Parameter unterscheiden sich von Unterklasse zu Unterklasse. Deshalb würde ich gerne in der Hauptklasse eine Referenz auf den aktuellen Supplier und Parameter halten und dann anschließend die Methoden der Hauptklasse aufrufen (die ja dann nicht mehr abstrakt, sondern implementiert wäre).
Versteht ihr was ich meine?