Как создать набор, в который можно добавить только один тип, который не позволяет добавлять подклассы или суперклассы? - PullRequest
2 голосов
/ 28 мая 2011

Мне нужен набор, который содержит только один тип данных и не позволяет ни одному из его суперклассов или подклассов быть добавленным в набор.

Ответы [ 3 ]

3 голосов
/ 28 мая 2011

вы можете использовать Object.getClass() определить тип ваших объектов.

если вы хотите гарантировать, что будут добавлены только классы типа MyClass, вы можете просто расширить HashSet и переопределить метод add(Object o) и добавить только элемент в коллекцию if (o.getClass() == MyClass.class):

Обновление: добавлен рабочий пример, который можно запустить как PoC.

public class MySet extends HashSet<MySet.MyClass> {
    public static class MyClass {}

    public static class MySubClass extends MyClass {}

    @Override
    public boolean add(MyClass c) {
        if (c.getClass() != MyClass.class) {
            throw new IllegalArgumentException("illegal class to add " + c.getClass().getName());
        }
        return super.add(c);
    }

    public static void main(String[] args) {
        MySet set = new MySet();
        set.add(new MyClass());   // works
        set.add(new MySubClass()); // throws Exception
    }

}

выполнение этого примера приводит к:

Исключение в потоке "main" java.lang.IllegalArgumentException: недопустимый класс для добавления MySet $ ​​MySubClass

3 голосов
/ 28 мая 2011

Ладно, я думаю, что полностью не понял суть.

Я бы, вероятно, использовал композицию, а не наследование, делегируя внутреннему HashSet<T>, но в add вы бы хотели проверить:

if (o.getClass() != clazz)
{
     // throw or reject
}

Обратите внимание, что это означает, что вам понадобится реальный класс во время выполнения, поэтому вам нужно будет создать набор с чем-то вроде:

ExactTypeSet<String> x = new ExactTypeSet<String>(String.class);
0 голосов
/ 28 мая 2011

В очень специализированном случае, когда вы знаете тип класса, который вы хотите добавить, вы можете расширить существующую реализацию Set и переопределить метод add(Object o), позволяя добавлять объекты только там, где o.getClass().getName().equals("yourclassname").

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