以下方法返回带有动态类型参数的列表:
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方法灵活性的情况下消除此未经检查的警告?
答案 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;
}