簡體   English   中英

在轉換為超類列表時,在Java中取消選中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM