我想要一个只保存一种数据类型的Set,并且不允许将其任何超类或子类添加到Set中。
答案 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}}。