2

在我的 Java 程序中,我需要将类型的对象List<? extends SomeBaseClass>转换为List<SomeBaseClass>. 如果我直接转换它,编译器会抱怨(显示警告)存在未经检查的转换。即使我可以确定所有对象都可以转换为它们的超类,编译器不会注意到它并报告未经检查的强制转换。我怎样才能摆脱警告?除了@SupressWarnings("unchecked") 还有其他方法吗?

PS:代码工作正常,我只是好奇是否有更好的做事方式。

编辑:

解决方案:如果他确定将来不会更改列表,则应该只进行这种类型的演员表。但是,当我们将单个对象从列表中取出时,最好将它们强制转换。

4

3 回答 3

7

编译器抱怨,因为如果您将类型对象添加SomeBaseClassList<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")是你最好的选择。

于 2010-12-18T21:29:29.517 回答
1

你正在尝试做的事情是不安全的。考虑这个简单的例子:

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);
    }
}
于 2010-12-18T21:29:22.320 回答
0

你很沮丧,这是一种不好的做法。尝试重构您的代码以避免这种转换。当然,在这种情况下,您不应该禁止显示警告。

于 2010-12-18T21:29:03.417 回答