Java 从对象到阵列列表的强制转换
错误消息: 类型安全:未选中从对象到ArrayList的强制转换Java 从对象到阵列列表的强制转换,java,jsp,Java,Jsp,错误消息: 类型安全:未选中从对象到ArrayList的强制转换 属性消息是从另一个jsp页面在ArrayList中发送的。如果有问题,只需添加注释即可 A a = new A(); ArrayList<A> myA = (ArrayList<A>)request.getAttribute("message"); 将对象强制转换为某种泛型类型是不安全的,它可能会导致ClassCastException。如果输入无效,您可以将其放入try并处理您的响应 无法确定列表是否
属性消息是从另一个jsp页面在ArrayList中发送的。如果有问题,只需添加注释即可
A a = new A();
ArrayList<A> myA = (ArrayList<A>)request.getAttribute("message");
将对象强制转换为某种泛型类型是不安全的,它可能会导致ClassCastException。如果输入无效,您可以将其放入try并处理您的响应
无法确定列表是否真的应该具有泛型参数。您必须事先知道参数应该是什么,否则在得到ClassCastException时就会发现。这就是代码生成警告的原因,因为编译器不可能知道是否安全。如果您想消除该警告,我将执行以下操作:
@SuppressWarning ("unchecked")
List<A> myA = (ArrayList< A >)request.getAttribute("message");
这不是错误,这是警告。如果你确定它是正确的,你可以。您也可以先使用instanceof检查对象的类型。@1blustone:不是泛型-您可以检查它是否是ArrayList,但不能使用instanceof检查它是否是ArrayList,因为在执行时没有这样的东西。@JonSkeet true,由于最初的帖子,不知道它是泛型列表。没有意识到对原始列表进行强制转换不会导致此警告。我想如果预期的返回类型已知,您可以转换为ArrayList或简单的原始类型。我不明白这个问题。你能解释一下你在这里的期望吗?这只是一个警告,所以您仍然可以继续。运行此命令时是否遇到java.lang.ClassCastException?@1Blastone:如果没有泛型特性,警告就不会出现。您误解了警告的意义。这不是将一个对象强制转换为某种类型的问题——它本身不会产生警告:objectx=foo;字符串y=字符串x;。关键是,将源代码中创建的东西作为ArrayList强制转换为ArrayList不会导致异常-转换将成功,因为类型信息在执行时不存在。访问元素时的隐式强制转换将导致异常。@JonSkeet无法确定列表是否真的应该具有泛型参数。您必须事先知道参数应该是什么,否则在得到ClassCastException时就会发现。这就是代码生成警告的原因,因为编译器不可能知道它是否安全。是的,但这并不是编译器知道它是否安全的问题。。。编译器几乎从不知道强制转换是安全的。如果类型参数错误,那么这行代码不会引发异常。我仍然认为这个答案是误导性的——它将常规的铸造方面与泛型特有的方面混为一谈。
List<A> castToArrayList() {
Object obj = request.getAttribute("message");
return ((List<?>) obj).stream().map(el -> (A) el).collect(Collectors.toList());
or
return ((List<?>)obj)
.stream()
.filter(A.class::isInstance)
.map(A.class::cast)
.collect(Collectors.toList());
}