0

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

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

4 回答 4

6
public MyClass implements DataListInterface<String>
于 2013-04-30T09:23:49.870 回答
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>();

AClassCastException将被适当地抛出,因为代码将尝试将a 强制转换Integer为 a String

于 2013-04-30T09:23:38.993 回答
1

首先,做上述任何事情都是高风险的。

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

如果你想在那时保护警告,@SuppressWarning那只是稍后发生炸弹的时间。发出警告是有原因的。

你可以通过

class Whatever implements SomeInterface<String>
于 2013-04-30T09:22:09.480 回答
-1

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

public  <T> List<T> getDataList() throws SQLException {
          List<String> l = new ArrayList<String>();
          l.add("Test");
           return (List<T>)l;
        }
于 2013-04-30T09:25:31.680 回答