Im Code Schnipsel unten kann ich eine statische Methode erstellen, die mir erlaubt alle möglichen Collection-Konstruktor-Referenzen zu übergeben und ich bekomme direkt ein Objekt vom selben Typ zurück ohne Casting. Also ArrayList::new gibt mir ArrayList<String> zurück ohne Compilererror.
Gibt es eine Möglichkeit die Variable supplier so zu definieren, dass sie auch alle möglichen Collection-Konstruktor-Referenzen akzeptiert und mir dann auch den entsprechenden Typ zurückgibt - identisch mit der statischen Methode. Die statische Methode erlaubt es zu definieren, also z.B. <T> und auch sowas wie DEST mit DEST extends Collection<T>. Geht sowas auch irgendwie mit Variablen?
Supplier<T, ? extends Collection<T>> supplier = // akzeptiert ArrayList<String>::new, LinkedList<String>::new, etc.
Sowas wie <T, DEST extends Collection<T>> Supplier<DEST> supplier = ArrayList<String>::new; geht ja auch jeden Fall nicht.
Kann man diese Art von Definition nur bei Methoden machen und nicht bei Klassen, Variablen, etc.?
Gibt es eine Möglichkeit die Variable supplier so zu definieren, dass sie auch alle möglichen Collection-Konstruktor-Referenzen akzeptiert und mir dann auch den entsprechenden Typ zurückgibt - identisch mit der statischen Methode. Die statische Methode erlaubt es zu definieren, also z.B. <T> und auch sowas wie DEST mit DEST extends Collection<T>. Geht sowas auch irgendwie mit Variablen?
Supplier<T, ? extends Collection<T>> supplier = // akzeptiert ArrayList<String>::new, LinkedList<String>::new, etc.
Sowas wie <T, DEST extends Collection<T>> Supplier<DEST> supplier = ArrayList<String>::new; geht ja auch jeden Fall nicht.
Kann man diese Art von Definition nur bei Methoden machen und nicht bei Klassen, Variablen, etc.?
package incubator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.function.Supplier;
public class MethodReferenceTest {
public static void main(String[] args) {
String[] array = { "Barbara", "James", "Mary", "John", "Patricia", "Robert", "Michael", "Linda" };
List<String> list = Arrays.asList(array);
ArrayList<String> result = transferElements(list, ArrayList::new);
Supplier<ArrayList<String>> supplier = ArrayList<String>::new;
ArrayList<String> get = supplier.get();
}
public static <T, SOURCE extends Collection<T>, DEST extends Collection<T>> DEST transferElements(SOURCE sourceCollection, Supplier<DEST> collectionFactory) {
DEST result = collectionFactory.get();
for (T t : sourceCollection) result.add(t);
return result;
}
}