消除未经检查的警告:将String转换为T

时间:2013-04-30 09:17:23

标签: java generics casting

以下方法返回带有动态类型参数的列表:

public List<T> getDataList() throws SQLException {
  List<T> l = new ArrayList<T>();
  l.add((T) "Test");
  return l;
}

这给了我一个未经检查的演员警告。

如果我将代码更改为:

public List<T> getDataList() throws SQLException {
  List<String> l = new ArrayList<String>();
  l.add("Test");
  (List<T>) return l;
}
它几乎是一样的。我得到一个未经检查的演员警告。

问题:

是否可以在不失去getDataList方法灵活性的情况下消除此未经检查的警告?

4 个答案:

答案 0 :(得分:6)

public MyClass implements DataListInterface<String>

答案 1 :(得分:4)

我认为在这种情况下警告非常合适。

考虑包含泛型类型的方法,它实际上不那么通用,因为它只适用于String的类型参数。

public class Generic<T> {

    public List<T> getDataList() throws SQLException {
          List<T> l = new ArrayList<T>();
          l.add((T) "Test");
          return l;
        }
}

如果我要执行:

   Generic<Integer> generic = new Generic<Integer>();

由于代码会尝试将ClassCastException转换为Integer,因此String将被正确抛出。

答案 2 :(得分:1)

首先,执行上述任何操作都是非常危险的。

如果l.add((T) "Test");类型为ClassCastException,则T不会抛出String。在这种情况下,一旦可以直接返回List<String>,因为其他任何东西都会抛出异常。

如果你试图通过@SuppressWarning来保护警告,那么以后只会发生炸弹的暂停。警告是有原因的。

您可以通过

解决
class Whatever implements SomeInterface<String>

答案 3 :(得分:-1)

尝试像这样使用它。 (修改了你的第二种方法)

public  <T> List<T> getDataList() throws SQLException {
          List<String> l = new ArrayList<String>();
          l.add("Test");
           return (List<T>)l;
        }