微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

| 我想要一个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\")
处添加对象。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。