如何创建一个集合,其中只能添加单个类型,不允许添加子类或超类?

问题描述

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

解决方法

        您可以使用“ 0”确定对象的类型。 如果要保证仅添加类型为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     ,        好吧,我想我完全误解了这一点。 我可能会使用组合而不是继承,在内部将其委托给
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\")
处添加对象。