亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java Unchecked Cast 警告:需要 ArrayList<T>

Java Unchecked Cast 警告:需要 ArrayList<T>

慕的地8271018 2022-06-23 17:54:54
我在 Java 中將泛型添加到我的分頁類中。我無法修復代碼以避免方法上出現這些“未經檢查的強制轉換”警告public ArrayList<T> getNextPage()警告:java:需要未經檢查的強制轉換:找到 java.util.ArrayList<T>:java.util.ArrayList<Contract>開啟:return (ArrayList<T>) getPaginatedContracts(startRow, pageSize);警告:java:需要未經檢查的強制轉換:找到 java.util.ArrayList<T>:java.util.ArrayList<Job>開啟:return (ArrayList<T>) getPaginatedJobs(startRow, pageSize);目前T可以是 aContract或 a Job。是否有另一種方法可以返回ArrayList<T>正確使用泛型而沒有任何警告?或者因為我的構造函數需要 aClass<T>并進行一些類型檢查:例如if (clazz.isAssignableFrom(Contract.class)) {...} 我可以使用@SuppressWarnings("unchecked")ongetNextPage()嗎?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 {    }
查看完整描述

1 回答

?
喵喵時光機

TA貢獻1846條經驗 獲得超7個贊

您可以將該類抽象化,然后子類必須實現實際的數據庫調用:


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但實際的數據庫邏輯現在駐留在特定的子類中。


查看完整回答
反對 回復 2022-06-23
  • 1 回答
  • 0 關注
  • 405 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號