簡體   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