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