Массив универсального интерфейса - PullRequest
3 голосов
/ 20 октября 2010

Можем ли мы создать массив универсального интерфейса в 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

1 Ответ

3 голосов
/ 20 октября 2010

К сожалению, 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];
        }
    }
    

Теперь выМожно использовать этот фабричный метод без каких-либо дополнительных предупреждений.

Общий совет.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...