在编写程序时,我想如果可以添加多种类型的元素,例如整数,字符串,长等在一个列表中,而不使它接受对象类型的一切。我们可以在列表中插入多种类型的元素吗?
我想限制列表接受只有这三种类型的元素?这可能吗?
有它的一些解决方案,我不想做
1)我们可以创建拥有所有这三种类型的元素一个POJO,并插入POJO。
2)基类实现数据类型特定的包装类。在这种情况下,用户将在创建不同类的对象时知道这个抽象。
这可以以更好更通用的方式完成吗?
在编写程序时,我想如果可以添加多种类型的元素,例如整数,字符串,长等在一个列表中,而不使它接受对象类型的一切。我们可以在列表中插入多种类型的元素吗?
我想限制列表接受只有这三种类型的元素?这可能吗?
有它的一些解决方案,我不想做
1)我们可以创建拥有所有这三种类型的元素一个POJO,并插入POJO。
2)基类实现数据类型特定的包装类。在这种情况下,用户将在创建不同类的对象时知道这个抽象。
这可以以更好更通用的方式完成吗?
你有号码使用,以及任何类型的数字。
但是String和Number之间没有关系。因此,List<Object>
是你唯一的选择。
请记住:当你真的需要处理不同类型的元素 - 也许List不是正确的抽象使用?!换句话说,如果你有属于不同类型的值,你应该考虑创建一个特定的类来包装这些值。
你可以做什么替代方案,是实现你自己的收集类型。这可能有3 add
-方法接受所需的不同类型,默认add
-方法应抛出UnsupportedOperationException
。
但是,这可能不是理想的解决方案,因为如果您不完全了解您正在实施/扩展的集合如何在内部工作,它可能会引入错误。
那么他的删除方法会是什么样子?好像在引擎盖下面只有3个单独的列表。 –
更好的解决方案是使用Map<TypeOfData, List<Type>>
而不是黑客List
来实现它。
在我看来,你可以用面向对象的方式用代理类来解决这个问题。 您可以引入一个类MyListForSpecific,它包含一个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换挡一切都委托功能,选择“生成代理” .. 确保您的类具有列表类型的变量,它尚未
虽然可能有一些黑客一起解决方法可能会帮助你做到这一点,你的问题的简单答案是“不,这是不能做到的”。编程的一部分是使用正确的工具来完成正确的工作。在这种情况下,几乎可以肯定的是,List是帮助你完成这项工作的错误工具。
为什么你想要做这样的事情?有一天,有人可能不得不跟随你,必须阅读并理解你的代码。我正在努力想出一个很好的理由来做到这一点。 –
另一个选项 - 将一个列表
@AndyThomas虽然技术上是真的,但这只是一个解决方法,几乎是一个可怕的设计 – Michael