繁体   English   中英

警告:[未选中]未经检查的强制转换。 泛型

[英]Warning: [unchecked] unchecked cast. Generics

我遇到了未经检查的演员的警告。 我不知道如何解决警告。

编译器错误似乎在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编译时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

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

它应该是这样的:

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

如果您认为您的演员表应该@SuppressWarnings("unchecked") - 在方法或语句级别添加@SuppressWarnings("unchecked") (更小的范围更好)。 编译器不会发出任何消息,但如果转换错误,您仍会在运行时获得异常。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM