Если предположить, что у меня есть следующий классGeneric преобразования списка в массив
public class A <T>{
private T [] datas;
// more code here ...
}
И я хочу, чтобы воспользоваться конструктором, чтобы инициализировать массив. Предположим, что у меня есть следующий конструктор
public A(T element){....}
Java не позволяет мне использовать что-то вроде
datas = new T[10]
И будет жаловаться, что я не может создать общий массив T Но я могу еще используйте работу, например:
@SuppressWarnings("unchecked")
public A(T element){
List<T> datasList = new ArrayList<T>();
datasList.add(element);
datas =(T[]) datasList.toArray();
}
У меня есть предупреждение от компилятора, поэтому мне пришлось добавить @Suppress Предупреждения, но моя точка связана со следующим комментарием от документации метода ToArray (Пожалуйста, обратите внимание на рисунок)
Это говорит о том, возвращаемый массив является безопасной. Значит ли это, что безопасно использовать этот метод? Если не так? И что было бы лучшим способом сделать такую инициализацию в конструкторе? Я также хотел бы рассмотреть случай переменного списка элементов T в перегруженном конструкторе, таком как
public A (T ... elements) {....}.
Вам не обязательно использовать список, но можете попробовать '(T []) Array.newInstance (element.getClass(), 10)'. Это все равно будет генерировать предупреждение из-за приведения, но вы можете смело игнорировать это, если 'element.getClass()' is 'Class' (который должен быть в большинстве случаев - если 'T' не определяется чем-то другим и 'element' будет подклассом определенного' T'). –
Thomas
@Thomas спасибо. это будет трюк. – alainlompo
Хороший вариант, я не думал об этом. Прокомментировал комментарий –