【问题标题】:How can I restrict the arraylist to accept only a specfic type of object prior to generic如何限制 arraylist 在泛型之前只接受特定类型的对象
【发布时间】:2012-05-21 03:13:20
【问题描述】:

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

【问题讨论】:

    标签: java generics collections arraylist


    【解决方案1】:

    编写一个只接受允许类型的包装函数,并隐藏集合。这是 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 字节码兼容

    【讨论】:

    • 该应用程序是一个非常古老的遗留系统,所以不确定它是否是用 java 1.4 编写的
    【解决方案2】:

    两个选项,(我在这里假设 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

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2021-05-26
      • 1970-01-01
      • 2020-05-20
      • 2022-10-04
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多