代码之家  ›  专栏  ›  技术社区  ›  Jono

Java中集合长度数组的抽象方法

  •  1
  • Jono  · 技术社区  · 14 年前

    我试图创建一个抽象数组方法,指定数组的这个抽象对象只能容纳3个项。

    现在我试着做这样的事 public abstract BaseAdapter[3] adapters(); 但它抱怨错误,不能这样做。

    是他们的另一种方式还是我只需要做 public abstract BaseAdapter[] adapters(); ?

    这很好,但是子类仍然可以传递一个大于3项的数组

    7 回复  |  直到 14 年前
        1
  •  5
  •   aioobe    14 年前

    你可以这样解决它:

    • 创建一个名为 createAdapters() 带返回类型 BaseAdapter[]

      protected abstract BaseAdapter[] createAdapters();
      
    • 在你的超级班级里你有一个 最后方法 adapters 执行以下操作:

      public final BaseAdapter[] adapters() {
          BaseAdapter[] adapters = createAdapters();
          if (adapters.length != 3)
              throw new Exception("Error: Please return 3 adapters.");
          return adapters;
      }
      

    另一种选择是创建一个名为 BaseAdapterTriple (可能有更具描述性的名称)包含三个baseadapter,并将其用作返回值。

        2
  •  1
  •   Andy    14 年前

    据我所知,没有办法对方法签名中的对象设置这样的限制。要么在实现方法中使用异常,要么使用自定义类。

        3
  •  0
  •   sleske    14 年前

    你似乎误解了 abstract Java中的修改器。

    摘要 适用于 方法 ,而不是字段/变量,因此您正在尝试的内容无法工作。

    请描述您想要完成的工作,然后我们可以提供帮助:—)。

    参见 http://download.oracle.com/javase/tutorial/java/IandI/abstract.html 为了解释 摘要 .

        4
  •  0
  •   Roman    14 年前

    不,数组和列表都不能这样做。如果数字超过3,则可以引发异常并记录此行为。

        5
  •  0
  •   Colin Hebert    14 年前

    如果你想要一个 adapters() 只能返回3的方法 BaseAdapter 在遵守3max合同的情况下,最多有子类自己执行“退货”,您应该在 适配器() 方法,并调用 abstract 方法。

    例如:

    abstract class YourAbstractClass{
        public BaseAdapter[] adapters(){
            BaseAdapter[] adapters = internalAdapters();
            if(adapters.length > 3){
                throw new IllegalStateException();
            }
            return adapters;
        }
    
        protected abstract BaseAdapter[] internalAdapters();
    }
    
        6
  •  0
  •   Community CDub    7 年前

    aioobe's answer 这是一个很好的方法,但我也会提出一些不同的建议:

    如果您需要一个方法来返回一个特定大小的数组,那么您可能想问一个问题,为什么一开始数组就是这个方法的合适返回类型,而不是使用一个简单的POJO,它可以很容易地封装“3 baseadapters”的思想,即:

    public class ThreeAdapters {
        BaseAdapter getAdapter1() { ...}
        BaseAdapter getAdapter2() { ...}
        BaseAdapter getAdapter3() { ...}
    }
    

    如果您将“返回3个适配器”的概念封装到它自己的类中,这样就可以将其用作返回类型(当然,您可能会找到一个更合适的类名称),那么对于涉及的每个人来说,这就更清楚了。

        7
  •  0
  •   Stephen C    14 年前

    在Java中,数组的大小不是其类型的一部分。或者换句话说,具有给定基类型的所有数组类型都是相同的。此外,您不能 签名 这会限制数组类型参数或结果的大小。

    这意味着您需要对方法进行编码,以测试(在您的情况下)它将返回的数组的长度。这可能对您没有多大帮助,因为我假设您正试图利用静态类型来强制实现数组的“三重性”。从这个角度来看@matt b的答案是关于钱的,尽管你可以用一种仍然可以给你数组(长度为3)的方式来做:

    public class AdapterTriple {
        private Adapter[] adapters;
        /**
         * This constructor may throw an exception
         */
        public AdapterTriple(Adapter[] adapters) {
            if (adapters.length != 3) {
                throw new IllegalArgumentException("array length is wrong");
            }
            this.adapters = adapters;
        }
        /**
         * This constructor won't throw an exception (apart from Errors)
         */
        public AdapterTriple(Adapter adapter1, Adapter adapter2, Adapter adapter3) {
            this.adapters = adapters = new Adapters[] {
                    adapter1, adapter2, adapter3};
        }
        /**
         * @return an array of 3 adapters.
         */
        public Adapter[] {
            return adapters;
        }
    }
    

    总之,不能在Java中静态地执行数组大小约束。您必须动态地进行,但是您可以采取措施使运行时错误不太可能发生。