Как избежать неконтролируемого литья при клонировании HashSet? - PullRequest
21 голосов
/ 13 февраля 2012

Я пытаюсь сделать поверхностную копию HashSet of Points под названием myHash. На данный момент у меня есть следующее:

HashSet<Point> myNewHash = (HashSet<Point>) myHash.clone();

Однако этот код дает мне непроверенное предупреждение. Есть ли лучший способ сделать это?

Ответы [ 2 ]

44 голосов
/ 13 февраля 2012

Вы можете попробовать это:

HashSet<Point> myNewHash = new HashSet<Point>(myHash);
7 голосов
/ 07 апреля 2015

Другой ответ предлагает использовать new HashSet<Point>(myHash).Однако цель clone() - получить новый объект того же типа.Если myHash является экземпляром подкласса HashSet, любое дополнительное поведение, добавленное подклассом, будет потеряно при использовании new HashSet<Point>(myHash).

Непроверенное предупреждение о приведении - это просто предупреждение.Есть много ситуаций, в которых приведение является безопасным, но компилятор просто недостаточно умен, чтобы определить, что это безопасно.Однако вы можете выделить предупреждение в один метод, который можно аннотировать с помощью @SuppressWarnings("unchecked"):

@SuppressWarnings("unchecked")
static <T implements Cloneable> clone(T o) { return (T)(o.clone()); }
...