如何创建一个只能添加不允许添加子类或超类的单个类型的 Set?



我想要一个Set,它只包含一种数据类型,不允许将其任何超类或子类添加到Set中。

您可以使用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.IollegalArgumentException中出现异常:添加MySet$MySubClass的非法类

好吧,我想我完全误解了这一点。

我可能会使用组合而不是继承,在内部委托给HashSet<T>,但在add中,您需要检查:

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

请注意,这意味着您在执行时需要实际的类,因此您需要使用以下内容来构造集合:

ExactTypeSet<String> x = new ExactTypeSet<String>(String.class);

在一个非常特殊的情况下,如果您知道要添加的类的类型,您可以扩展现有的Set实现并覆盖add(Object o)方法,只允许在o.getClass().getName().equals("yourclassname")的位置添加对象。

最新更新