我们如何限制arraylist在泛型
之前仅接受特定类型的对象答案 0 :(得分:2)
编写一个仅接受允许类型的包装函数,并隐藏集合。这是Java-5之前的标准最佳实践。
private final List strings = new ArrayList();
public void add(String s)
{
strings.add(s);
}
public String remove(String s)
{
return (String) strings.remove(s);
}
// etc...
是的,这很糟糕。
我可能会问:您是否有理由不使用泛型?它们 字节码与Java 1.4兼容
答案 1 :(得分:1)
两个选项,(我在这里假设C#,但几乎都适用于所有OO语言)。
1)从选择集合类型(或其接口)继承,覆盖所有方法以在错误类型上抛出异常,如下所示:
public class MyType
{
// Your type here
}
public class MyTypeCollection : ArrayList
{
public override int Add(object value)
{
if (!(value is MyType))
{
throw new ArgumentException("value must be of type MyType");
}
return base.Add(value);
}
public int Add(MyType myType)
{
return base.Add(myType);
}
// Other overrides here
}
或 2)(可能更好),完全创建自己的类型并实现集合所需的接口,并在内部使用非泛型的非类型集合。像这样:
public class MyTypeCollection2 : IEnumerable
{
private readonly ArrayList _myList = new ArrayList();
public void Add(MyType myType)
{
_myList.Add(myType);
}
// Other collection methods
public IEnumerator GetEnumerator()
{
yield return _myList.Cast<MyType>();
}
}
确保实现您将关注的所有接口。在.NET Framework中,为ArrayList实现的接口是:IList,ICloneable
希望这有帮助。