К сожалению, Java не поддерживает создание универсальных массивов.Я не знаю точную причину.На самом деле, дженерики существуют только во время компиляции и удаляются при запуске javac, т.е. переходят из .java в .class.Но этого недостаточно, чтобы понять ограничение.Вероятно, у них были некоторые проблемы обратной совместимости с такой функцией.
Вот обходные пути, которые вы можете использовать.
Используйте коллекции (например, список) вместо массива.
List<Sameple> list = new ArrayList<Sameple>(); // this is OK and typesafe
Создайте массив без шаблонов, поместите код в специальный фабричный метод, помеченный @SuppressWarnings
:
public class Test {
interface Sample<T>{}
@SuppressWarnings("unchecked")
public static <T> Sample<T>[] sampleArray() {
return new Sample[2];
}
}
Теперь выМожно использовать этот фабричный метод без каких-либо дополнительных предупреждений.
Общий совет.
Подавлять предупреждения - плохая практика.Предупреждения являются потенциальными проблемами.Поэтому, если мне нужно подавить предупреждение, я, по крайней мере, пытаюсь уменьшить область, в которой предупреждение подавлено.К сожалению, устаревшие Java-API не поддерживают обобщений.Мы часто получаем предупреждения, когда используем такие API.Я всегда пытаюсь локализовать такое использование в специальные классы или, по крайней мере, методы, такие как sampelArray()
.Эти методы отмечены @SuppressWarning
и часто содержат комментарии, объясняющие, почему предупреждения здесь подавляются.