我想要一个Set,它只包含一种数据类型,不允许将其任何超类或子类添加到Set中。
您可以使用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.IollegalArgumentException中出现异常:添加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")
的位置添加对象。