2011-09-07 80 views
42

下面的代碼:無法執行instanceof檢查對參數化類型的ArrayList <Foo>

((tempVar instanceof ArrayList<Foo>) ? tempVar : null); 

原因:

無法執行對參數化類型ArrayList<Foo>instanceof檢查。使用形式ArrayList<?>替代,因爲進一步的泛型類型信息將在運行時被刪除

有人可以給我解釋一下什麼是「進一步泛型類型信息將在運行時被刪除」以及如何解決這個問題是什麼意思?

+1

谷歌:「Java類型擦除」 – jjnguy

回答

45

這意味着如果您有任何參數化,例如泛型信息將在運行時被刪除。相反,這是JVM將看到的內容List fooList = new ArrayList();

這叫做type erasure。 JVM在運行時沒有參數List(在本例中)的類型信息。

修復?由於JVM在運行時沒有參數化類型的信息,因此您無法執行ArrayList<Foo>instanceof。您可以明確「存儲」參數化類型並在那裏進行比較。

10

由於類型擦除,ArrayList的參數化類型在運行時不會被知道。您可以用instanceof做的最好的檢查是否tempVarArrayList(任何東西)。要以通用的方式執行此操作,請使用:

((tempVar instanceof ArrayList<?>) ? tempVar : null); 
1

您無法解決該問題。泛型的類型信息在運行時不可用,您將無法訪問它。您只能檢查數組的內容。

1

instanceof運算符在運行時工作。但是java不會在運行時攜帶參數化類型信息。它們在編譯時被擦除。因此錯誤。

23

你總是可以做到這一點,而不是

try 
{ 
    if(obj instanceof ArrayList<?>) 
    { 
     if(((ArrayList<?>)obj).get(0) instanceof MyObject) 
     { 
      // do stuff 
     } 
    } 
} 
catch(NullPointerException e) 
{ 
    e.printStackTrace(); 
} 
+7

什麼樣,如果它是空的 –

+0

@RafaelRuiz我想簡單的try/catch投向右ArrayList類型會做的伎倆? –

0

你總是可以做到這一點

創建一個類

public class ListFoo { 
    private List<Foo> theList; 

    public ListFoo(List<Foo> theList { 
    this.theList = theLista; 
    } 

    public List<Foo> getList() { 
    return theList; 
    } 
} 

是不一樣的,但...

myList = new ArrayList<Foo>; 
..... 
Object tempVar = new ListFoo(myList); 
.... 
((tempVar instanceof ListFoo) ? tempVar.getList() : null); 
2

這就夠了:

if(obj instanceof ArrayList<?>) 
{ 
    if(((ArrayList<?>)obj).get(0) instanceof MyObject) 
    { 
     // do stuff 
    } 
} 

事實上,左操作數instanceof檢查是否是null與否,並返回false如果它實際上是null
所以:無需趕上NullPointerException

+2

這不是更適合對原始帖子發表評論嗎? – Greg

0

您可以使用

boolean isInstanceArrayList = tempVar.getClass() == ArrayList.class 
相關問題