2011-03-10 3 views
3

У меня есть очень простая картаТип безопасности: Переполнение литая и Дженерики

private Map<String,T> map = Collections.synchronizedSortedMap(new TreeMap<String,T>()); 

Я хотел бы определить следующий метод

public T[] values(){ 
    return (T[])map.values().toArray(); 
} 

И очевидно, что я в конечном итоге с бесконтрольной гипсе проблема ... Моя проблема в том, что я не могу вызывать toArray(new T[size]).

Что я должен сделать, чтобы избежать этого предупреждения (wihtout с помощью @SuppressedWarning)

Благодарности

+0

Почему вы не можете позвонить вArray (новый T [размер]) ??. – Zimbabao

+0

use toArray (новый T [0]) – Zimbabao

+1

В Java вы не можете создать общий массив T => ваш код не будет компилироваться – BlackLabrador

ответ

0

Самое лучшее, что я могу думать о том, чтобы создать конструктор для вашего класса, который принимает массив типа Т (т.е. аргумент T []). Ожидается, что пользователь вашего класса предоставит массив нулевого размера. Затем вы можете использовать этот массив для вызова toArray (T []).

+0

Я не мог найти способ предоставить пользователю объект T.class в конструкторе, потому что, похоже, не существует способа построить массив нулевого размера из экземпляра класса, не запускаясь в одно и то же исключенное исключение исключения. – necromancer

+0

Вы можете построить массив, используя отражение с помощью 'Array.newInstance()'. Конечно, у него все равно будет предупреждение; но он не будет сбой при исключении класса. – newacct

4

Избегайте массивов. Возврат List<T>.

Массивы необходимы основные строительные блоки, однако они довольно странные в системе типов. Лучше избегать их в API. Почти везде массив можно заменить на ArrayList. Производительность такая же.

+0

Да, массивы подобны строкам. Иногда их рассматривают как примитивы, а иногда их рассматривают как коллекции. Лучше уйти с реальной коллекцией. –

0

Что я должен сделать, чтобы избежать этого предупреждения (wihtout использования @SuppressedWarning)

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

Поскольку массивы в Java содержат ссылку на свой класс компонентов во время выполнения, невозможно построить такой массив без знания класса. Или попросите пользователя передать что-то, что позволит вам получить объект класса для класса T, или вам просто нужно будет вернуть Object[]

0

Чтобы получить массив общего типа, вам необходимо передать объект класса ваш метод, иначе он вернет массив типа Object [].

public T[] values(Class<T> cl){ 
    return (T[])map.values().toArray((T[])Array.newInstance(cl,0)); 
} 

Вам по-прежнему необходимо использовать SuppressdWarning для этого кода, но он не будет бросать во время выполнения. Кроме того, если вам нужно реализовать Collection.values ​​(), вы должны передать класс в свой ctor. Массивы и дженерики просто не смешиваются, поэтому вы должны предпочесть использовать коллекции.

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