Почему выскакивает ошибка: incompatible types: java.util.HashSet<java.lang.Object> cannot be converted to java.util.Set

253
10 сентября 2017, 00:07

Здравствуйте. Задание заключается в том, чтобы добавить три элемента во множество HashSet, затем удалить один элемент из него и вывести все это на экран. Создание и заполнение, удаление, вывод на печать реализуются в разных методах одного класса. У меня проблема в том, что в одном из методов, который создает и заполняет HashSet, я не могу это множество использовать вместе с return. В чем может быть проблема?

public class Solution {
    public static void main(String[] args) {
        Set<Cat> cats = createCats();
        cats.remove(0);
        printCats(cats);
    }
    public static Set<Cat> createCats() {
        //напишите тут ваш код. step 2 - пункт 2
        HashSet<Object> map = new HashSet<Object>();
        for (int i = 0; i < 3; i++) {
            Cat cat = new Cat();
            map.add(cat);
        }
        return map;
    }
    public static void printCats(Set<Cat> cats) {
        // step 4 - пункт 4
        for (Object cat: cats) {
            System.out.println(cat);
        }
    }
    public static class Cat {
    }
}
Answer 1

Remove должен получить обьект который нужно удалить а не его индекс

можно сделать так

 public static void main(String[] args) {
    Set<Cat> cats = createCats();
    cats.remove(cats.iterator().next());
    printCats(cats);
}
Answer 2
  1. Вы смешивайте типы элементов коллекций там, где это не нужно: если вы работаете с Cat, то коллекции следует создавать данного типа, либо, если тип не важен, то использовать wildcard.
  2. Как уже писали выше Set.remove принимает не индекс элемента, а сам элемент. НО: вариант cats.remove(cats.iterator().next()) выдаст ошибку при пустой коллеции.

Я немного отрефакторил ваш код с учетом вышеназванных замечаний (+ использовал местами stream-ы - тут уже кому как больше нравится).

public static void main(String[] args) {
    Set<Cat> cats = createCats(3);
    removeFirst(cats);
    printCats(cats);
}
public static Set<Cat> createCats(long size) {
    return Stream.generate(Cat::new).limit(size).collect(Collectors.toSet());
}
public static void removeFirst(Set<?> cats){
    Iterator<?> it = cats.iterator();
    if (it.hasNext()) {
        it.next();
        it.remove();
    }
}
public static void printCats(Set<?> cats) {
    cats.forEach(System.out::println);
}
READ ALSO
Android, копирование файлов

Android, копирование файлов

Есть следующее задание

232
что будет если к классу не добавить @MappedSuperclass и @Access(AccessType.FIELD)?

что будет если к классу не добавить @MappedSuperclass и @Access(AccessType.FIELD)?

Для чего эти аннотации существуют понятно, но вот что будет если в главном классе по иерархии их не указать, просто пропустить?

215
Верстка писем, фоновое изображение

Верстка писем, фоновое изображение

В таблице в теге <td> я прописываю background="https://namecom/static/name/img/bg

235