2010-10-13 3 views
1

Я пытаюсь создать метод абстрактного массива, который указывает, что этот абстрактный объект массива может содержать только 3 элемента.абстрактный метод набора длины массива в java?

Теперь я попытался сделать что-то вроде этого public abstract BaseAdapter[3] adapters();, но он жалуется на ошибку, что это невозможно сделать таким образом.

это их другой способ или мне нужно просто сделать public abstract BaseAdapter[] adapters();?

Это будет работать нормально, но класс суб-прежнему может передать массив больше 3 пунктов

+0

Ваш вопрос непонятен. Вы хотите создать класс или метод? Пожалуйста, отредактируйте свой вопрос. – sleske

+0

Тип возврата не является частью сигнатуры метода, что означает, что вы не можете принудительно ввести определенный тип возврата в суперклассу. –

ответ

5

Вы могли бы решить, как это:

  • Создать абстрактный вспомогательный метод (который можно переопределить) с именем createAdapters() с возвращаемым типом BaseAdapter[]

    protected abstract BaseAdapter[] createAdapters(); 
    
  • В вашем супер-классе у вас есть a окончательный методadapters, который выполняет следующие действия:

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

Другой альтернативой было бы создать простой класс под названием BaseAdapterTriple (возможно, с более описательным названием), содержащий три BaseAdapters, и использовать это в качестве возвращаемого значения.

+1

Итак, пожалуйста, объявите метод как окончательный :) – pgras

+0

ах, спасибо, исправлено – aioobe

0

Вы, кажется, не понимают смысл abstract модификатора в Java.

abstract относится к классов и методов, а не к полям/переменных, так что вы пытаетесь работать не может.

Опишите, что вы хотите сделать, а затем мы можем помочь :-).

См., Например, http://download.oracle.com/javase/tutorial/java/IandI/abstract.html для объяснения abstract.

1

Насколько я знаю, нет способа разместить такие ограничения на объектах в сигнатуре метода. Либо использовать исключения в методах реализации, либо использовать пользовательские классы.

0

Нет, вы не можете сделать это ни с помощью массивов, ни списков. Вы можете выбросить исключение, если число превышает 3 и документировать это поведение.

0

Если вы хотите adapters() метода, который может возвращать только 3 BaseAdapter в большинстве и имеющие подклассы для реализации «возвращения» себя при соблюдении договора 3max, вы должны сделать проверку в методе adapters() и запустит abstract метода.

Например:

abstract class YourAbstractClass{ 
    public BaseAdapter[] adapters(){ 
     BaseAdapter[] adapters = internalAdapters(); 
     if(adapters.length > 3){ 
      throw new IllegalStateException(); 
     } 
     return adapters; 
    } 

    protected abstract BaseAdapter[] internalAdapters(); 
} 
0

aioobe's answer хороший подход взять, но я бы также предложить что-то немного по-другому:

Если требующий метод возвращает массив определенный размер, вы можете задать вопрос, почему массив является подходящим типом возврата для этого метода, а не просто с помощью простого POJO, который может легко инкапсулировать идею «3 базовых адаптера», то есть:

Это намного понятнее всем, кто участвует, если вы инкапсулируете идею «вернуть 3 адаптера» в собственный класс, чтобы это можно было использовать в качестве типа возврата (конечно, вы можете найти более подходящее имя для класса) ,

0

В 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; 
    } 
} 

Таким образом, вы не можете обеспечить соблюдение ограничений на размер массива статически Ява. Вы должны делать это динамически, но вы можете предпринять шаги, чтобы сделать ошибки времени выполнения маловероятными.

Смежные вопросы