Mam następujący problem podczas korzystania z java generic. Zasadniczo muszę wykonać konwersję z listy podtypu na listę jego nadtypu i definiuję taką metodę:
public static <T> List<T> getList(List<? extends T> input) {
ArrayList<T> list = new ArrayList<T>();
list.addAll(input);
return list;
}
Jednak nie jestem pewien, jak mogę wywołać tę metodę? Biorąc pod uwagę typ A, B rozszerza A:
List<A> alist = getList(List<B> blist);
Ma typ niezgodności, ponieważ w tym przypadku dostarczam tylko informacje o typie B do wywołania metody.
Jak mogę wywołać metodę z dostarczonymi informacjami o typie A?
Dzięki.
2 odpowiedzi
List<B> blist = ...
List<A> alist = ClassName.<A>getList(blist);
Zauważ, że możesz również użyć tutaj konstruktora ArrayList
:
List<A> alist = new ArrayList<A>(blist);
Co powiesz na
public static void <T, S extends T> List<T> getList(List<S> input)
List<? extends T>
. Wywołania nadal nie są kompilowane bez określenia argumentów typu.
Podobne pytania
Nowe pytania
java
Java to język programowania wysokiego poziomu. Użyj tego tagu, jeśli masz problemy z używaniem lub zrozumieniem samego języka. Ten tag jest rzadko używany samodzielnie i jest najczęściej używany w połączeniu z [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] i [maven].
ClassName.<A>getList(blist)
w javaT
, i jako taki może akceptować tylko jeden argument typu,A
w tym przypadku.A
ma znaczenie, ponieważ jest to żądany typ zwrotu.B
nie ma większego znaczenia poza tym, że musi to być podtypA
.