如何解决如何创建一个集合,其中只能添加单个类型,不允许添加子类或超类?
| 我想要一个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 举报,一经查实,本站将立刻删除。