我们如何限制数组列表在泛型之前只接受特定类型的对象
问问题
910 次
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 回答