避免Java泛型警告?

时间:2014-09-04 01:13:16

标签: java generics warnings

我是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;
}

我可以更改哪些内容以避免这些警告?如果有一个更好的方法,那么推动正确的方向将会非常受欢迎。

2 个答案:

答案 0 :(得分:1)

创建一个同时包含IntegerString

的新类

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;
}