【问题标题】:ArrayList<T> with different types for TArrayList<T> 具有不同类型的 T
【发布时间】:2013-09-16 09:58:03
【问题描述】:

我想要一个具有不同但相似类型的列表。 例如,我想将不同验证器类的列表放在一个列表中。

例如:

ArrayList<T> validators = new ArrayList<T>();
validators.add(new StringValidator());
validators.add(new IntegerValidator());

这可能吗?

【问题讨论】:

    标签: java templates generics arraylist


    【解决方案1】:

    下面是一个完整的例子:

    首先,定义一个接口:

    public interface Validator {
        void validate();
    }
    

    然后,创建一个实现:

    public class IntegerValidator implements Validator {
    
        public void validate() {
            // Validate
        }
    } 
    

    字符串验证器实现:

    public class StringValidator implements Validator {
        public void validate() {
            // Validate
        }
    }
    

    这是客户端代码:

    public class Test {
    
        public static void main(String[] args) {
            List<Validator> v = new ArrayList<Validator>();
            v.add(new StringValidator());
            v.add(new IntegerValidator());
    
            for (Validator validator : v) {
                validator.validate();
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      如果你只是想添加,那么

      ArrayList<Validator> validators = new ArrayList<Validator>();
      validators.add(new StringValidator());
      validators.add(new IntegerValidator());
      

      完全没问题。但是如果你想让你的子类类型被超类类型引用,那么

      如果您想使用超类引用来引用 Validator 的子类,请使用 ArrayList&lt; ? extends Validator&gt; validators = new ArrayList&lt;Validator&gt;(); where all your validators extendsValidator`。阅读generics wildcard operator here

      【讨论】:

        【解决方案3】:

        是的,如果验证器共享一个超类,您可以将其作为类型提供。

        List<Validator> validators = new ArrayList<Validator>();
        validators.add(new StringValidator());
        validators.add(new IntegerValidator());
        

        这里的许多答案都将第一种类型指定为&lt;? extends Validator&gt;,但这是不必要的。它允许您将第二种类型指定为 Validator 子类,即

        List<? extends Validator> validators = new ArrayList<ValidatorSubClass>();
        

        【讨论】:

          【解决方案4】:

          创建一个名为Validator的超类,并让StringValidator和IntegerValidator扩展(或实现)Validator,然后你可以像这样初始化你的ArrayList:

          ArrayList<Validator> validators = new ArrayList<Validator>();
          validators.add(new StringValidator());
          validators.add(new IntegerValidator());
          

          【讨论】:

            【解决方案5】:

            是的,你总是可以这样做:

            ArrayList<object> validators = new ArrayList<object>();
            validators.add(new StringValidator());
            validators.add(new IntegerValidator());
            

            在你的情况下也是

            ArrayList<Validator> validators = new ArrayList<Validator>();
            validators.add(new StringValidator());
            validators.add(new IntegerValidator());
            

            你看,当你声明什么是T 时,只有你声明的类或扩展类可以放在ArrayList 中。所以当你声明一个共同的父母时,比如Validator,那么你可以将StringValidatorIntegerValidator添加到ArrayList

            【讨论】:

              【解决方案6】:

              根据Generics tutorial,可以使用

              List<? extends Validator> validators = new ArrayList<>();
              validators.add(new StringValidator());
              validators.add(new IntegerValidator());
              

              其中StringValidatorIntegerValidator 扩展Validator

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2021-07-19
                • 2021-02-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-12-29
                • 1970-01-01
                相关资源
                最近更新 更多