【问题标题】:Unchecked assignment: 'java.util.List' to 'java.util.Collection<? extends manu.apps.lucemtrader.classes.Investor>'未经检查的分配:'java.util.List' 到 'java.util.Collection<?扩展 manu.apps.lucemtrader.classes.Investor>'
【发布时间】:2021-12-16 19:39:56
【问题描述】:

我有一个适配器,其中有两个列表,一个列表用于 InvestorsList,其中包含投资者列表,另一个列表称为 InvestorListFull,用于在搜索时过滤结果。

以下是我声明列表的方式

 List<Investor> investorList;
 List<Investor> investorListFull;

以下是在我的 recyclerview 适配器构造函数中分配列表的方式


public InvestorsAdapter(Context context, List<Investor> investorList) {

        this.context = context;
        this.investorList = investorList;

        investorListFull = new ArrayList<>(investorList);

    }

以下是我如何过滤投资者列表中的结果

public Filter getInvestorFilter() {
        return investorFilter;
    }

    private final Filter investorFilter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            List<Investor> filteredList = new ArrayList<>();

            if (constraint == null || constraint.length() == 0) {
                filteredList.addAll(investorListFull);
            } else {
                String filterPattern = constraint.toString().toLowerCase().trim();

                for (Investor investor : investorListFull) {

                    if (investor.getUsername().toLowerCase().contains(filterPattern)) {
                        filteredList.add(investor);
                    }

                    if (investor.getDateJoined().toLowerCase().contains(filterPattern)) {
                        filteredList.add(investor);
                    }

                }
            }

            FilterResults filterResults = new FilterResults();
            filterResults.values = filteredList;

            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults filterResults) {
            investorList.clear();
            investorList.addAll((List) filterResults.values);
            notifyDataSetChanged();
        }
    };

我在发布结果时遇到 Unchecked assignment 错误 InvestorList.addAll((List) filterResults.values);

【问题讨论】:

    标签: java android android-studio arraylist


    【解决方案1】:

    我在发布结果时遇到 Unchecked cast 错误 InvestorList.addAll((List) filterResults.values);

    那是因为你正在做一个未经检查的演员表。实际上,您正在那里进行检查 未检查强制转换。

    (List) filterResults.values 是一个 检查 演员表。这意味着 Java 编译器将在字节码中插入一条checkcast 指令,以确保filterResults.valuesObject)确实是List 的一个实例。

    但是,investorList.addAll 需要 List&lt;Investor&gt;,而不是 ListListraw type。您可以将原始类型的List 传递给期望List&lt;Something&gt; 的方法;但这被标记为不安全,因为编译器无法保证它确实是List&lt;Something&gt; - 由于类型擦除,List 没有任何内容使其成为“Something 列表”。编译器可以插入checkcast 指令以确保它是List;但不能确保它是List&lt;Something&gt;:这一事实是未经检查的

    警告的意思是“这里可能有问题;我无法证明它是错误的”。如果您确定 - 通过构造 - filterResults.values 确实是 List&lt;Investor&gt;,将其转换为 List&lt;Investor&gt; 是安全的。

    你应该把这行写成:

    investorList.addAll((List<Investor>) filterResults.values);
    

    请注意,这仍然会给你一个未经检查的强制转换警告,因为它仍然是一个未经检查的强制转换 - 你也应该避免使用原始类型。

    如果您对抑制警告有信心,请声明一个变量,这样您就可以专门针对该变量抑制警告,而不必将抑制添加到方法或类中;并记录为什么在那里压制是安全的:

    @SuppressWarnings("unchecked") // Safe because <reason>
    List<Investor> listOfInvestors = (List<Investor>) filterResults.values;
    investorList.addAll(listOfInvestors);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      • 2015-05-02
      • 2019-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-18
      相关资源
      最近更新 更多