[英]Unchecked cast in Java when casting to list of superclasses
在我的Java程序中,我需要转换一个List<? extends SomeBaseClass>
类型的对象List<? extends SomeBaseClass>
List<? extends SomeBaseClass>
为List<SomeBaseClass>
。 如果我直接转换它,编译器会抱怨(显示警告)存在未经检查的强制转换。 即使我可以确定所有对象都可以转换为它们的超类,编译器也不会注意到它并报告未经检查的强制转换。 我该如何摆脱警告? 除了@SupressWarnings(“未选中”)还有其他方法吗?
PS:代码工作正常,我只是好奇是否有更好的做事方式。
编辑:
解决方案:如果他确定将来不会更改列表,则应该只进行此类投射。 但是当我们将单个对象从列表中取出时,最好将其抛出。
编译器抱怨,因为如果你将一个SomeBaseClass
类型的对象添加到List<SomeBaseClass>
列表中,你可能会“违反” List<? extends SomeBaseClass>
的内容List<? extends SomeBaseClass>
List<? extends SomeBaseClass>
列表。
这里是一个例子,当Number
作为你的SomeBaseClass
:
List<? extends Number> doubles = new ArrayList<Double>();
List<Number> nums = (List<Number>) doubles;
nums.add(new Integer(5)); // no compiler complaints here...
// doubles now contains an Integer value!
如果在你的情况下@SuppressWarnings("unchecked")
这个问题,我相信@SuppressWarnings("unchecked")
是你最好的选择。
你要做的是不安全。 考虑这个简单的例子:
import java.util.*;
class SomeBaseClass
{
}
class SomeSubClass extends SomeBaseClass
{
public static void main(String[] a)
{
List<SomeSubClass> orig = new ArrayList<SomeSubClass>();
// Compiles with no warnings. This is the purpose of the ? extends syntax
List<? extends SomeBaseClass> l1 = orig;
// This is what you're trying to do
List<SomeBaseClass> l2 = (List<SomeBaseClass>) l1;
// Then, we add a SomeBaseClass to the new list
l2.add(new SomeBaseClass());
// ClassCastException, since this casts a SomeBaseClass to a SomeSubClass
SomeSubClass first = orig.get(0);
}
}
你是沮丧的,这是一种不好的做法。 尝试重构代码以避免这种转换。 当然,在这种情况下你不应该压制警告。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.