我是Java的泛型功能的新手,我在其中一种方法中遇到了一些困难。 Eclipse给了我几个警告,我想避免。该方法将布尔标志作为其参数,并根据布尔值返回List<Integer>
或List<String>
。我可以将方法拆分为两个,每个案例一个,但我不愿意将逻辑保存在一个地方。
带注释警告的简化方法:
private <T> List<T> getList(boolean returnInt) {
// List is a raw type. References to generic type List<E> should be parameterized
List returnList;
if (returnInt) {
returnList = new ArrayList<Integer>();
} else {
returnList = new ArrayList<String>();
}
if (mShowNew) {
if (returnInt) {
// Type safety: The method add(Object) belongs to the raw type List.
// Refs to generic type List<E> should be parameterized.
returnList.add(ID_NEW);
} else {
// Type safety: The method add(Object) belongs to the raw type List.
// Refs to generic type List<E> should be parameterized.
returnList.add("New");
}
}
if (mResume) {
if (returnInt) {
returnList.add(ID_RESUME);
} else {
returnList.add("Resume");
}
}
// Pattern continues
// Type safety: The expression of type List needs unchecked conversion to
// conform to List<T>
return resultList;
}
我可以更改哪些内容以避免这些警告?如果有一个更好的方法,那么推动正确的方向将会非常受欢迎。
答案 0 :(得分:1)
创建一个同时包含Integer
和String
E.g。
public class Result {
private String stringResult = null;
private Integer intResult = null;
}
根据需要填写此内容并将其用作
List<Result> returnList;
当然也让你的方法返回
private List<Result> getList(boolean returnInt) {
答案 1 :(得分:0)
如果参数仅用于确定resturnd列表的嵌套类型,那么除了类型作为参数之外,您可以指定所需的列表类型。
这可能是这样的:
private <T> List<T> getList(Class<T> listType) {
if (!(listType.getClass().equals(Integer.class)
|| listType.getClass().equals(String.class))) {
throw new IllegalArgumentException(
String.format("Type '%s' is currently not supported.", listType.getClass().getName()));
}
// v--- the missing type specification was causing the warnings you mentioned
List<T> returnList = new ArrayList<>();
if (mShowNew) {
if (listType.getClass().equals(Integer.class)) {
returnList.add(ID_NEW);
} else {
returnList.add("New");
}
}
if (mResume) {
if (listType.getClass().equals(Integer.class)) {
returnList.add(ID_RESUME);
} else {
returnList.add("Resume");
}
}
//...
return resultList;
}