【问题标题】:Java Unchecked Cast Warning: required ArrayList<T>, found ArrayList<Contract>Java Unchecked Cast 警告:需要 ArrayList<T>,找到 ArrayList<Contract>
【发布时间】:2019-07-12 00:37:56
【问题描述】:

我在 Java 中将泛型添加到我的分页类中。我无法修复代码以避免方法 public ArrayList&lt;T&gt; getNextPage() 上出现这些“未经检查的强制转换”警告

警告:java: unchecked cast
必需:java.util.ArrayList
找到:java.util.ArrayList

开启:
return (ArrayList&lt;T&gt;) getPaginatedContracts(startRow, pageSize);

警告:java: unchecked cast
必需:java.util.ArrayList
找到:java.util.ArrayList

开启:
return (ArrayList&lt;T&gt;) getPaginatedJobs(startRow, pageSize);

目前T 可以是ContractJob

是否有另一种方法可以返回 ArrayList&lt;T&gt;,它正确使用泛型而没有任何警告?

或者因为我的构造函数采用Class&lt;T&gt; 并进行一些类型检查:例如
if (clazz.isAssignableFrom(Contract.class)) {...}
我可以在getNextPage() 上使用@SuppressWarnings("unchecked") 吗?

public class PaginationWrapper<T> {

    private Class<T> clazz;
    private int currentPage;
    private int pageSize;

    public PaginationWrapper(Class<T> clazz) {
        this.clazz = clazz;
        this.currentPage = -1;
        this.pageSize = 100;
    }

    private static ArrayList<Contract> getPaginatedContracts(int startRow, int pageSize) {
        ArrayList<Contract> list = new ArrayList<>(pageSize);
        // Get info from database
        return list;
    }

    private static ArrayList<Job> getPaginatedJobs(int startRow, int pageSize) {
        ArrayList<Job> list = new ArrayList<>(pageSize);
        // Get info from database
        return list;
    }

    public ArrayList<T> getNextPage() {
        currentPage++;
        int startRow = currentPage * pageSize;
        if (clazz.isAssignableFrom(Contract.class)) {
            // Warning: java: unchecked cast
            // required: java.util.ArrayList<T>
            // found: java.util.ArrayList<Contract>
            return (ArrayList<T>) getPaginatedContracts(startRow, pageSize);
        } else if (clazz.isAssignableFrom(Job.class)) {
            // Warning: java: unchecked cast
            // required: java.util.ArrayList<T>
            // found: java.util.ArrayList<Job>
            return (ArrayList<T>) getPaginatedJobs(startRow, pageSize);
        }
        return null;
    }


    static class Contract {
    }

    static class Job {
    }

    public static void main(String[] args) {
        PaginationWrapper<Contract> contractWrapper = new PaginationWrapper<>(Contract.class);
        ArrayList<Contract> paginatedList = contractWrapper.getNextPage();
    }
}

【问题讨论】:

  • 如果你正在执行一个重要的演员表,那么它是 going 被标记的。这样的演员表本质上是不安全的。
  • 为什么首先使用泛型?在我看来真的没有意义。因为你可以直接调用特定的方法

标签: java generics


【解决方案1】:

您可以将该类抽象化,然后子类必须实现实际的数据库调用:

public abstract class PaginationWrapper<T> {
    private int currentPage = 1;
    private int pageSize = 100;

    public ArrayList<T> getNextPage() {
        currentPage++;
        int startRow = currentPage * pageSize;

        // here we delegate to the implementation
        return getNextPage(startRow, pageSize);
    } 

    protected abstract ArrayList<T> getNextPage(int startRow, int pageSize);
}

然后创建2个子类

public class JobPagination extends PaginationWrapper<Job> {
    protected ArrayList<Job> getNextPage(int startRow, int pageSize) {
         return /* list from database */
    }
}

public class ContractPagination extends PaginationWrapper<Contract> {
    protected ArrayList<Contract> getNextPage(int startRow, int pageSize) {
         return /* list from database */
    }
}

现在通用逻辑被打包到PaginationWrapper,但实际的数据库逻辑现在驻留在特定的子类中。

【讨论】:

  • 这与我得出的结论完全相同。尝试了代码,它可以工作。 :-)
猜你喜欢
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多