2014-11-15 5 views
0

Я новичок в Java и сталкиваюсь с проблемой при объявлении универсального массива как статического. Мне нужна ваша помощь , чтобы решить и понять, что происходит не так.Общая декларация статического массива

public class ThreadedSorter<E> { 

    private static int number_of_threads = 2; 

    private static E[] array, aux;  

    .... 

    public static <E> E[] mergeSort(E[] unsortarray) { 
     array = unsortarray; 
     ..... 
     return array; 
    } 

    private static void mergeSortHelper(int low, int hi) { 
     if(low==hi) return; 
     int mid = (low+hi) >> 1; 
     mergeSortHelper(low,mid); 
     mergeSortHelper(mid+1, hi); 
     merge(low,mid+1,hi); 
    } 

    private static void merge(int low, int hi, int upperBound) { 

     ..... 

     while(low <=mid && hi <= upperBound) 
      if(array[low] <= array[hi]) 
       aux[j++] = array[low++]; 
     ........ 
    } 


endclass 

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

"private static E [] array, aux;"

Не могли бы вы рассказать мне, где мне не хватает.

С уважением, Pratik

+0

Просто не используйте массивы, особенно при работе с дженериками. Используйте коллекции! – Seelenvirtuose

+0

Обратите внимание, что ваш метод 'mergeSort' не должен иметь параметр типа' '- обратите внимание, что это другой параметр типа, который скрывает параметр типа' E' от класса. – Jesper

ответ

1

То, что вы пытаетесь сделать, просто не может быть сделано. Нет общих статических элементов.

Как правило, вы передавали бы эти массивы другим методам.

public static <E> E[] mergeSort(E[] unsortarray) { 
    ... 
} 

private static <E> void mergeSortHelper(
    E[] arr, E[] aux, int low, int hi 
) { 
    ... 
} 

private static <E> void merge(
    E[] arr, E[] aux, int low, int hi, int upperBound 
) { 
    ... 
} 

Сохраняя это вспомогательные данные, как статические члены не очень хорошая идея, так или иначе, потому что это означает, что ваши методы не могут быть вызваны одновременно.

1

Сначала вам нужно изучить, что такое статический модификатор, поскольку он является источником ошибки, о которой вы просите. https://stackoverflow.com/a/413904/3657704

Я не понимаю, почему вы бы использовать статические модификаторы везде в коде, конечно, в более продвинутом разговора я хотел бы сказать, что вы пытаетесь сделать что-то иметь много статических полей и методов в классе под названием «ThreadedSorter ».

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

И, конечно, ответ на радиоиде тоже прав.

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