我们可以在List中插入多种类型的元素吗?

时间:2017-04-26 13:04:38

标签: java

在处理程序时,我想如果可以添加多种类型的元素,例如List中的Integer,String,Long等,但不接受Object类型的所有内容。

我想限制列表只接受这三种类型的元素?这可能吗?

它的解决方案很少,我不想做

1)我们可以创建一个Pojo,将所有这三种类型作为元素插入并插入pojo。

2)实现特定于数据类型的包装类的基类。在这种情况下,用户将在创建不同类的对象时知道此抽象。

这可以用更好,更通用的方式完成吗?

5 个答案:

答案 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是帮助您完成这项工作的错误工具。