2017-04-26 29 views
1

在编写程序时,我想如果可以添加多种类型的元素,例如整数,字符串,长等在一个列表中,而不使它接受对象类型的一切。我们可以在列表中插入多种类型的元素吗?

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

有它的一些解决方案,我不想做

1)我们可以创建拥有所有这三种类型的元素一个POJO,并插入POJO。

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

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

+3

为什么你想要做这样的事情?有一天,有人可能不得不跟随你,必须阅读并理解你的代码。我正在努力想出一个很好的理由来做到这一点。 –

+0

另一个选项 - 将一个列表作为私有实现细节包装在外部类中,该类提供了一个仅用于整数,字符串和长整型的API。 –

+0

@AndyThomas虽然技术上是真的,但这只是一个解决方法,几乎​​是一个可怕的设计 – Michael

回答

0

你有号码使用,以及任何类型的数字。

但是String和Number之间没有关系。因此,List<Object>是你唯一的选择。

请记住:当你真的需要处理不同类型的元素 - 也许List不是正确的抽象使用?!换句话说,如果你有属于不同类型的值,你应该考虑创建一个特定的类来包装这些值。

+1

更正:'列表'不是你唯一的选择。重新思考你的设计,以便你没有'List '是另一个。 – Michael

+0

这部分我已经加入了。有什么是替代'列表'''列表'? – GhostCat

+0

嗯,不是。你不能用'' – Michael

2

你可以做什么替代方案,是实现你自己的收集类型。这可能有3 add-方法接受所需的不同类型,默认add-方法应抛出UnsupportedOperationException

但是,这可能不是理想的解决方案,因为如果您不完全了解您正在实施/扩展的集合如何在内部工作,它可能会引入错误。

+0

那么他的删除方法会是什么样子?好像在引擎盖下面只有3个单独的列表。 –

0

更好的解决方案是使用Map<TypeOfData, List<Type>>而不是黑客List来实现它。

0

在我看来,你可以用面向对象的方式用代理类来解决这个问题。 您可以引入一个类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换挡一切都委托功能,选择“生成代理” .. 确保您的类具有列表类型的变量,它尚未

+1

而当你需要实现'getStrings()'等?循环整个事物来提取相关条目?所有这一切为了什么?你最好只是单独列出'清单','清单'等。 – Michael

+0

你是对的,但作者要求他的具体问题的解决方案..所以这是一个常见的使用类型委托 – Noixes

0

虽然可能有一些黑客一起解决方法可能会帮助你做到这一点,你的问题的简单答案是“不,这是不能做到的”。编程的一部分是使用正确的工具来完成正确的工作。在这种情况下,几乎可以肯定的是,List是帮助你完成这项工作的错误工具。

相关问题