Почему boolean containsAll (Collection <?> c); метод рамок сбора допускается для каждого типа ?. Но boolean addAll (Коллекция <? Extends E> c); Разрешить ? расширяет E. Так, я написал программу для уточнения. Вот моя программаКонструктивное решение boolean containsAll (Collection <?> c) vs boolean addAll (Collection <? extends E> c); в рамках сбора
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);
}
Итак, мой вопрос, когда я могу получить преимущество resultList.containsAll (resultList1); когда общий типа different.In моего случая строки и ServiceDto.Was есть некоторые вещи неправильно, заменяющих булева containsAll (Коллекция <?> с) с булевой containsAll (Collection <? расширяет E> с)
Equals и hashCode - это методы в Object, то есть >. Когда вы ищете коллекцию, содержащую что-то, что вы не хотите, чтобы каждый раз приводить ее к соответствующему типу. –
@artbristol: Да, это по сути тот же вопрос, и у него есть лучший ответ. Я проголосую, чтобы отметить его как дубликат. –
Было бы скучно, если бы мне пришлось скопировать содержимое моей коллекции > в коллекцию extends E>, чтобы я мог вызвать containsAll(). Это по сути эквивалентно методу equals(), принимающему параметр типа Object. (Хорошо, с типом стирания, оба сборника - это всего лишь коллекция