2014-12-18 3 views
0

У меня есть быстрый вопрос о безопасности типаJava и «Тип безопасность ...»

У меня есть этот метод и переменный класс, определенные:

private List<SelectItem> listBait = null; 


public List<SelectItem> getListBait() { 
    // Cache to avoid resorting and rebuilding list numerous times 
    if (null == listBait) { 
     listBait = ConfigurationBean.getCurrentInstance().getMeta().getListBait(); 
    } 
    return listBait; 
} 

Теперь я получаю предупреждение о назначении в if. Он говорит Type safety: The expression of type List needs unchecked conversion to conform to List<SelectItem>.

Первый метод getCurrentInstance в ConfigurationBean является:

public static ConfigurationBean getCurrentInstance() { 
    // This is a neat way to get a handle on the instance of this bean in the application scope from other Java code... 
    FacesContext context = Util.getFacesContext(); 
    ConfigurationBean bean = (ConfigurationBean) context.getApplication().getVariableResolver().resolveVariable(context, "Configuration"); 
    return bean; 
} 

... и метод getMeta (и экземпляр переменной) является:

private final MetaDataBean meta = new MetaDataBean(); 

public MetaDataBean getMeta() { 
    return meta; 
} 

Метод getListBait() из MetaDataBean выглядит это:

public List<SelectItem> getListBait() { 
    List<SelectItem> options = new ArrayList<SelectItem>(); 
    for (Bait bait : getAllBaits()) { 
     if (!bait.isInActive()) { 
      options.add(new SelectItem(bait.getKey(), bait.getName())); 
     } 
    } 
    return options; 
} 

Так что из того, что я понимаю, это не должно предупреждение, о котором идет речь ...? Любой, кто может это объяснить, - предлагаемые решения, похоже, не решают проблему (кроме @SuppressWarning ;-)).

Это на Java 1.6.

Заранее благодарен!

Редактировать
... и, пройдя через это редактирование, фактически решило его!

Что случилось, что, вероятно, некоторые дружественные советы от Затмения «помог» мне определить MetaDataBean так:

public class MetaDataBean<whyFish> extends BaseBean implements Serializable { 
: 
: 

... и это не имеет смысла. Я не могу сказать, когда это маленькое «» было добавлено в декларацию, - но удаление, из-за которого все предупреждения исчезли :-)

Спасибо большое! - Сейчас я до сих пор верю немного в том, что Java я знаю, до сих пор ;-)

/John

+5

Пожалуйста, покажите короткую, но * полную * программу, демонстрирующую проблему. Здесь слишком много мы не знаем. Кроме того, обратите внимание, что нет необходимости использовать 'if (null == ...)' в Java ... причины его использования на некоторых языках не применимы к Java (где условие 'if' должно быть 'boolean' выражение) и поместить эту переменную в первую очередь для большинства людей. –

+3

Пожалуйста, проверьте, являются ли «ConfigurationBean» или некоторые из возвращаемых значений.Не предоставление общих параметров здесь может привести к тому, что компилятор также отключит их в вызове метода. – Thomas

+0

Как подсказывает @Thomas, проблема, вероятно, в 'getCurrentInstance' или' getMeta', а также объявление класса возвращаемых типов. – Radiodef

ответ

1

Поскольку сырье типа является стиранием этого типа (4.8), сырой MetaDataBean возвращает сырой List из getListBait.

Решение состоит в том, чтобы удалить параметр общего типа из MetaDataBean или не использовать необработанный тип в зависимости от того, действительно ли этот параметр необходим.

0

Согласно последней редакции. Дженерики были добавлены к одному из определений классов - возможно, благодаря дружественной помощи Eclipse (и, очевидно, я принимаю его, не зная точно, что я сделал!).

Отличные комментарии для дальнейшей информации помогли найти неправильную декларацию :-)

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