【发布时间】:2019-07-12 00:37:56
【问题描述】:
我在 Java 中将泛型添加到我的分页类中。我无法修复代码以避免方法 public ArrayList<T> getNextPage() 上出现这些“未经检查的强制转换”警告
警告:java: unchecked cast
必需:java.util.ArrayList
找到:java.util.ArrayList
开启:
return (ArrayList<T>) getPaginatedContracts(startRow, pageSize);
警告:java: unchecked cast
必需:java.util.ArrayList
找到:java.util.ArrayList
开启:
return (ArrayList<T>) getPaginatedJobs(startRow, pageSize);
目前T 可以是Contract 或Job。
是否有另一种方法可以返回 ArrayList<T>,它正确使用泛型而没有任何警告?
或者因为我的构造函数采用Class<T> 并进行一些类型检查:例如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 被标记的。这样的演员表本质上是不安全的。
-
为什么首先使用泛型?在我看来真的没有意义。因为你可以直接调用特定的方法