-1

我们如何限制数组列表在泛型之前只接受特定类型的对象

4

2 回答 2

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 字节码兼容

于 2012-05-13T06:22:17.933 回答
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

希望这可以帮助。

于 2012-05-13T06:33:16.953 回答