Dlaczego boolean zawiera All (Collection <?> c); metoda zbierania frameworku jest dozwolona dla każdego typu ?. Ale boolean addAll (Collection <? Extends E> c); pozwala na ? extends E. Tak, napisałem program do wyjaśnienia. Oto mój programDecyzja o projekcie boolean zawieraAll (Collection <?> c) vs boolean addAll (Collection <? extends E> c); w ramach kolekcji
public class ContainAllTest {
// take ServiceDto
ArrayList<ServiceDto> resultList = new ArrayList<ServiceDto>();
void Test() {
ServiceDto serviceDto = new ServiceDto();
serviceDto.setName("test");
resultList.add(serviceDto);
// another arraylist that takes String
ArrayList<String> resultList1 = new ArrayList<String>();
resultList1.add("test");
// no error, goes for run time.Contain all checking is done for two generic type ServiceDto and String:
resultList.containsAll(resultList1);
// error shown at compile time,as addAll take ServiceDto as generic type but the generic type for resultList1 take String:
resultList.addAll(resultList1);
}
Więc moje pytanie brzmi, kiedy mogę uzyskać przewagę resultList.containsAll (resultList1); gdy typ rodzajowy jest different.In moim przypadku String i ServiceDto.Was istnieją pewne rzeczy źle zastępując logiczną containsAll (Collection <?> c) z logiczną containsAll (Collection <? rozciąga E> c)
Równe i hashCode są metodami w Object, czyli >. Gdy szukasz kolekcji zawierającej coś, czego nie chcesz, musisz za każdym razem przesyłać ją do odpowiedniego typu. –
@artbristol: Tak, to zasadniczo to samo pytanie, które ma lepszą odpowiedź. Będę głosować, aby oznaczyć to jako duplikat. –
Byłbym żmudny, gdybym musiał skopiować zawartość mojej kolekcji > do kolekcji extends E> tylko po to, abym mógł wywołać containsAll(). Jest to zasadniczo odpowiednik metody equals() akceptującej parametr typu Object. (Ok, z typem wymazania obie Kolekcje to tylko Kolekcja