在处理程序时,我想如果可以添加多种类型的元素,例如List中的Integer,String,Long等,但不接受Object类型的所有内容。
我想限制列表只接受这三种类型的元素?这可能吗?
它的解决方案很少,我不想做
1)我们可以创建一个Pojo,将所有这三种类型作为元素插入并插入pojo。
2)实现特定于数据类型的包装类的基类。在这种情况下,用户将在创建不同类的对象时知道此抽象。
这可以用更好,更通用的方式完成吗?
答案 0 :(得分:2)
作为替代方案,您可以实现自己的集合类型。这可能有3个add
- 方法接受您想要的不同类型,默认add
- 方法应该抛出UnsupportedOperationException
。
然而,这可能不是理想的解决方案,因为如果您不完全了解正在实施/扩展的集合应该如何在内部工作,那么它可能会引入错误。
答案 1 :(得分:0)
您可以使用数字,以及任何类型的数字。
但是String和Number之间没有任何关系。
所以,List<Object>
是你唯一的选择。
请记住:当你真的必须处理不同类型的元素时 - 也许List不是正确的抽象使用?!
换句话说:如果你有不同类型的值,你应该考虑创建一个特定的类来包装这些值。
答案 2 :(得分:0)
更好的解决方案是使用Map<TypeOfData, List<Type>>
而非黑客List
来实现它。
答案 3 :(得分:0)
在我看来,您可以使用委托类以面向对象的方式解决此问题。 你可以介绍一个类&#34; MyListForSpecific&#34;它包含一个List对象并实现List。 您覆盖您实现的列表的add函数,并将所有其他函数委托给您的类中的列表对象。例如:
public class MyList implements List {
private List<Object> delegate;
public MyList(List<Object> list){
this.delegate = list;
}
public void add(int index, Object element) {
//here some code you want .. restrict element
delegate.add(index, element);
}
public boolean add(Object e) {
return delegate.add(e);
}
public boolean addAll(Collection<? extends Object> c) {
return delegate.addAll(c);
}
public boolean addAll(int index, Collection<? extends Object> c) {
return delegate.addAll(index, c);
}
[..]
在eclipse中,您可以使用alt shift s生成所有委托函数,并选择&#34;生成委托&#34; .. 确保您的类中包含列表类型的变量
答案 4 :(得分:0)
虽然可能有一些黑客攻击可以帮助你做到这一点,但你的问题的简单答案是“不,这不可能完成”。编程的一部分是使用正确的工具来完成正确的工作。在这种情况下,几乎可以肯定List是帮助您完成这项工作的错误工具。