【问题标题】:Warning: [unchecked] unchecked cast. Generics警告:[unchecked] 未经检查的演员表。泛型
【发布时间】:2013-10-15 09:10:54
【问题描述】:

我遇到了未经检查的演员表的警告。我不确定如何解决这些警告。

编译器错误似乎选择了list = (E[]) new IntKeyed [size];
这是我们假设使用字母的代码。
我们正在尝试使用泛型,因此使用“E”。

所以我想我一定在这段代码的某个地方搞错了。 当我查看错误时,它似乎与ArrayLists 相关,但据我所知,我没有使用ArrayList

也许我应该是ArrayLists?改变它会修复警告吗?我的代码中还有一个不完整的异常处理问题。但我认为这与 Array 问题无关。

您能找到的任何错误都会帮助我指明正确的方向。谢谢。

public abstract class MyArrayList<E> implements IntKeyed
{

private final int DEFCAP = 50;
private int origCap;
private int numElements;
private E[] list;

public MyArrayList()
{
    origCap = DEFCAP;
    list = (E[]) new IntKeyed [origCap];    *******Error Here
}

public MyArrayList( int size ) throws Exception
{
    size = DEFCAP;
    if( size > 0 )
    {
        list = (E[]) new IntKeyed [size];    *******Error Here
        origCap = size;
    }
    else
    {
        throw new ArrayStoreException();
        System.out.println("List size is invalid");
    }
    list = (E[]) new IntKeyed [size];         *******Error Here
}

private void enlarge ()
{
    E[] larger = (E[]) new IntKeyed [list.length + origCap]; *******Error Here
    for( int i = 0; i < list.length; i++)
    {
        larger[i] = list[i];
    }
    list = larger;
}

使用javac -Xlint:unchecked MyArrayList.java 编译时 我明白了:

MyArrayList.java:29: warning: [unchecked] unchecked cast
    list = (E[]) new IntKeyed [origCap];
                 ^
required: E[]
found:    IntKeyed[]
where E is a type-variable:
E extends Object declared in class MyArrayList
MyArrayList.java:37: warning: [unchecked] unchecked cast
        list = (E[]) new IntKeyed [size];
                     ^
required: E[]
found:    IntKeyed[]
where E is a type-variable:
E extends Object declared in class MyArrayList
MyArrayList.java:45: warning: [unchecked] unchecked cast
    list = (E[]) new IntKeyed [size];
                 ^
 required: E[]
found:    IntKeyed[]
where E is a type-variable:
E extends Object declared in class MyArrayList
MyArrayList.java:117: warning: [unchecked] unchecked cast
    E[] larger = (E[]) new IntKeyed [list.length + origCap];
                       ^
required: E[]
found:    IntKeyed[]
where E is a type-variable:
E extends Object declared in class MyArrayList
MyArrayList.java:43: error: unreachable statement
        System.out.println("List size is invalid");
        ^
1 error
4 warnings

【问题讨论】:

    标签: java generics unchecked-cast


    【解决方案1】:

    警告不是问题,问题是抛出异常后无法访问语句。

    应该是这样的:

    System.out.println("List size is invalid");
    throw new ArrayStoreException();
    

    如果您认为您的强制转换应该起作用 - 在方法或语句级别添加 @SuppressWarnings("unchecked")(范围越小越好)。编译器不会发出任何消息,但如果转换错误,您仍然会在运行时收到异常。

    【讨论】:

      【解决方案2】:

      list = (E[]) new IntKeyed [origCap]; 处的警告实际上意味着通用 E 被硬编码为 IntKeyed,因此无论您传递给 E,您的 list 将始终保持为 IntKeyed 类型。

      在您的情况下,通用使用似乎不适合,因为您已经为此目的实现了特定接口。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多