【问题标题】:Common Ancestor to Java Array and ListJava 数组和列表的共同祖先
【发布时间】:2011-01-27 09:25:27
【问题描述】:

在 .NET 中,数组和列表都以 Enumerable 作为祖先,因此接受 Enumerable 作为参数的方法可以同时接收数组和列表作为其参数。 不知道Java中是否有类似的东西?

【问题讨论】:

    标签: java enumerable


    【解决方案1】:

    两者都派生自java.lang.Object。但是,这与收藏无关,我认为这正是您要寻找的。​​p>

    【讨论】:

      【解决方案2】:

      Java 中的数组和列表除了 java.lang.Object 之外没有共同的祖先。

      两者都可以使用 foreach 循环访问,如下所示:

      String [] array = new String [] { "foo", "bar", "baz", };
      List<String> list = Arrays.asList( "x", "y", "z");
      
      for (String s : array)
          System.out.println(s);
      
      for (String s : list)
          System.out.println(s);
      

      【讨论】:

        【解决方案3】:

        不,Java 中没有等价物。我通常建议您设计 API 方法来接收List&lt;T&gt;Collection&lt;T&gt;Iterable&lt;T&gt;。虽然这些排除了直接使用数组调用方法,但您可以使用Arrays.asList 非常轻松地包装数组。对于调用者来说,这比将数组指定为方法参数更灵活,后者会强制执行单个实现。

        我同意这并不理想。

        请注意,在 .NET 中,一维数组不仅实现 IEnumerable&lt;T&gt; - 它们还实现 IList&lt;T&gt;

        【讨论】:

          【解决方案4】:

          它们没有共同的祖先,但是,有一些方法可以根据需要在两种类型之间进行转换 -

          所以你可以提供一个重载方法来转换为一个通用类型——即

          public void doAll(MyType[] array) {
              doAll(Arrays.asList(array));
          }
          
          public void doAll(List<MyType> list) {
              //... process List here.
          }
          

          【讨论】:

            【解决方案5】:

            基本上,数组有一个隐式类型,它是对象的子类。请参阅 JLS 中的Arrays

               public static void main(String[] args) {
                        int[] ia = new int[3];
                        System.out.println(ia.getClass());
                        System.out.println(ia.getClass().getSuperclass());
               }
            
               > class [I
               > class java.lang.Object
            

            当我们考虑covariance/contravariance 时,处理数组和列表的方式也不同。

            List<Object> l = new ArrayList<String>(); // complain 
            Object[] l2 = new String[1]; // ok
            
            l2[0] = 4; // throw ArrayStoreException.
            

            如果我们考虑泛型,情况会变得更糟,但这是另一个话题。总而言之,我不知道这种设计的基本原理,但我们需要接受它。

            【讨论】:

              【解决方案6】:

              Iterable&lt;T&gt;IEnumerable&lt;T&gt; 的 Java 等价物。所有/大多数集合都实现了这个接口(包括ArrayList 和数组),所以是的。但它不是“祖先”(它也不在 .NET 中),而是一个通用接口。

              【讨论】:

              • 这个答案不正确。数组不实现 Iterable。
              猜你喜欢
              • 2014-05-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-10-01
              • 1970-01-01
              • 2014-04-08
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多