2016-04-16 4 views
0

Я хочу написать метод, который будет проверять размер массива, и если его больше, чем SIZE, я хочу выбросить ошибку, однако я не знаю размеров массива.Все ли массивы в java реализуют один и тот же интерфейс?

Например:

private void checkValidSize(int[] arr){ 
    if (arr.length > SIZE) 
     throw new RuntimeException(Messages.WRONG_INPUT_ERROR); 

} 

Если я называю его 1d массива он работает нормально, но это не работает для 2d массивов. Как я понимаю, массив 2d - это массив, содержащий массивы, поэтому мне нужен только метод, который принимает любой массив в качестве аргумента и измеряет его длину.

Если бы я знал, что все массивы реализуют какой-то интерфейс, такой как IMesurable, я просто буду ждать IMesurable в checkValidSize.

Есть ли что-нибудь подобное или любой другой вариант, поэтому моя функция будет работать на любом массиве?

+0

'length' отлично работает для всех типов массивов – Andrew

+0

я знаю, но метод не займет 2d массива в качестве параметра при 1d массива, как ожидается, – amirani

+0

использования' Object' если размер массива неизвестен – Andrew

ответ

0

Там не реализован интерфейс или метод который может быть использован для проверки того, является ли массив массивом 2d. если вы посмотрите на Arrays # deepEquals(), вы получите представление о том, как java обрабатывает вложенные массивы. Например. благодаря большому количеству проверок и кастингов.

Предположим, что вы ищете общий счетчик int, исключая сами массивы (не просто свойство #length), вам нужно выполнить «проверку глубины». Что-то вроде этого:

public static int getDeepLength(Object array) 
{ 
    int count = 0; 

    if(array instanceof int[]) 
     count += ((int[])array).length; 

    if(array instanceof Object[]) 
     for(Object current : (Object[])array) 
      count += getNestedCount(current); 

    return count; 
} 

static int getNestedCount(Object obj) 
{ 
    if (obj instanceof Object[]) 
     return getDeepLength((Object[])obj); 

    if (obj instanceof int[]) 
     return ((int[])obj).length; 

    return 1; 
} 

instanceof Object[] проверка необходима для вложенных массивов, так как сам массив считается объектом. (и, следовательно, массив IntArrays == - массив объектов). Обратите внимание, что это defenitly не наиболее оптимальное решение, и, возможно, лучше это сделать.

Также, если вы используете примитивные типы данных, отличные от целых, вам также нужно будет проверить их. (Массив # deepEquals0() дает обзор того, что нужно проверить).

Если вас интересует более подробная информация о массивах, а также о том, как они созданы во время выполнения и т. Д. this post дает краткое описание деталей массивов в java.

Надеюсь, что это было полезно!

0

Существует по существу 2 пути.

Путь № 1 - использовать перегрузки. Массивы являются ковариантными, поэтому любой массив, который не является одномерным примитивным массивом, можно присваивать Object[].

// this method accepts e.g. 
// String[] 
// int[][] 
// etc... 
static void checkValidSize(Object[] arr) {...} 

// now define an overload for every primitive 
static void checkValidSize(char[] arr) {...} 
static void checkValidSize(int[] arr) {...} 
... 

Путь № 2 предназначен для использования java.lang.reflect.Array.

static void checkValidSize(Object shouldBeArr) { 
    if (java.lang.reflect.Array.getLength(shouldBeArr)) { 
     ... 
    } 
} 

Основная недостатка - нет никакой проверки компиляции того, что вы передаете ей. Вы можете передать что-то, что не является массивом.

(Некоторые люди могут сказать, «отражение медленно!», Но это полностью зависит от того, что вы делаете. getLength специально признана HotSpot в настоящее время, и он получает встраиваемыми.)

+0

Благодарим за быстрый ответ – amirani

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

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