如何限制arraylist在泛型之前仅接受特定类型的对象

时间:2012-05-13 06:16:07

标签: java generics collections arraylist

我们如何限制arraylist在泛型

之前仅接受特定类型的对象

2 个答案:

答案 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

希望这有帮助。

相关问题