2010-10-20 3 views
3

Можно ли создать массив общего интерфейса в java?Массив общего интерфейса

interface Sample<T>{} 

в другом классе

Sample<T> s[] = new Sample[2] ; // for this it shows warning 

Sample<T> s[] = new Sample<T>[2];// for this it shows error 
+0

Возможный дубликат [Java generics и инициализация массива] (http://stackoverflow.com/questions/470198/java-generics-and-array-initialization) – Thilo

+0

Возможный дубликат [Java как: Generic Array creation] (http://stackoverflow.com/questions/529085/java-how-to-generic-array-creation) – Bozho

ответ

3

К сожалению, Java не поддерживает создание общих массивов. Я не знаю точной причины. На самом деле генераторы существуют только во время компиляции и удаляются при запуске javac, т. Е. Переходят из .java в .class. Но этого недостаточно, чтобы понять это ограничение. Вероятно, у них были проблемы с обратной совместимостью с такой функцией.

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

  1. Использовать коллекции (например, список) вместо массива.

    List<Sameple> list = new ArrayList<Sameple>(); // this is OK and typesafe 
    
  2. Создание массива без дженериков, поместите код в специальный фабричный метод с аннотацией @SuppressWarnings:

    public class Test { 
        interface Sample<T>{} 
        @SuppressWarnings("unchecked") 
        public static <T> Sample<T>[] sampleArray() { 
         return new Sample[2]; 
        } 
    } 
    

Теперь вы можете использовать этот метод фабрики без дополнительного предупреждения.

Генеральный совет.

Это плохая практика, чтобы подавлять предупреждения. Предупреждения - это потенциальные проблемы. Поэтому, если мне нужно подавить предупреждение, я хотя бы попытаюсь уменьшить область, в которой предупреждение подавлено. К сожалению, устаревшие API Java не поддерживают дженерики. Мы часто получаем предупреждения, когда используем такие API. Я всегда пытаюсь локализовать такие виды использования в специальных классах или, по крайней мере, таких методах, как sampelArray(). Эти методы отмечены @SuppressWarning и часто содержат комментарии, которые объясняют, почему здесь подавляются предупреждения.

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