Новый оператор всегда возвращает одну и ту же ссылку - PullRequest
0 голосов
/ 28 сентября 2019

Оператор new всегда дает одну и ту же ссылку, то есть он не создает разные объекты, а просто возвращает ту же ссылку на уже существующий объект.

Я использую Java11.

У меня есть этот (упрощенный) интерфейс и класс:

public interface MyInterface {
    MyInterface newObject();
}
public class MyClass extends HashSet<Integer> implements MyInterface {
    @Override
    public MyClass newObject(){
        return new MyClass();
    }
}

, а затем в другом месте кода, где obj имеет тип MyClass:

HashSet<MyClass> set = new HashSet<MyClass>();
for(int i=0;i<10;i++) {
    MyClass t = (MyClass) ((MyInterface)obj).newObject();
    if(set.containsKey(t)) {
        System.out.println("error: "+i);
        System.exit(-1);
    }
    set.add(t);
}

Всегда выдает ошибку при i==1, т. Е. Та же ссылка снова генерируется оператором new.

Если я удаляю extends HashSet<Integer>, тогда он работает нормально, безошибка, т.е. он создает 10 уникальных объектов.

Я что-то здесь упускаю?Это ожидаемое поведение?

1 Ответ

0 голосов
/ 28 сентября 2019

Реализация AbstractSet для equals и hashcode зависит от элементов, хранящихся в наборе.2 набора считаются равными, если они содержат одинаковые объекты, все ваши новые объекты MyClass, будучи пустыми, "равны".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...