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

时间:2011-05-28 07:42:31

标签: java types set type-safety

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

3 个答案:

答案 0 :(得分:3)

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

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

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

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

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

答案 1 :(得分:3)

您可以使用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

答案 2 :(得分:0)

在一个非常专业的情况下,您知道要添加的类的类型,您可以扩展现有的Set实现并覆盖add(Object o)方法,只允许将对象添加到{{ 1}}。