下面的代碼:無法執行instanceof檢查對參數化類型的ArrayList <Foo>
((tempVar instanceof ArrayList<Foo>) ? tempVar : null);
原因:
無法執行對參數化類型
ArrayList<Foo>
instanceof
檢查。使用形式ArrayList<?>
替代,因爲進一步的泛型類型信息將在運行時被刪除
有人可以給我解釋一下什麼是「進一步泛型類型信息將在運行時被刪除」以及如何解決這個問題是什麼意思?
下面的代碼:無法執行instanceof檢查對參數化類型的ArrayList <Foo>
((tempVar instanceof ArrayList<Foo>) ? tempVar : null);
原因:
無法執行對參數化類型
ArrayList<Foo>
instanceof
檢查。使用形式ArrayList<?>
替代,因爲進一步的泛型類型信息將在運行時被刪除
有人可以給我解釋一下什麼是「進一步泛型類型信息將在運行時被刪除」以及如何解決這個問題是什麼意思?
這意味着如果您有任何參數化,例如泛型信息將在運行時被刪除。相反,這是JVM將看到的內容List fooList = new ArrayList();
。
這叫做type erasure。 JVM在運行時沒有參數List
(在本例中)的類型信息。
修復?由於JVM在運行時沒有參數化類型的信息,因此您無法執行ArrayList<Foo>
的instanceof
。您可以明確「存儲」參數化類型並在那裏進行比較。
由於類型擦除,ArrayList
的參數化類型在運行時不會被知道。您可以用instanceof
做的最好的檢查是否tempVar
是ArrayList
(任何東西)。要以通用的方式執行此操作,請使用:
((tempVar instanceof ArrayList<?>) ? tempVar : null);
您無法解決該問題。泛型的類型信息在運行時不可用,您將無法訪問它。您只能檢查數組的內容。
instanceof運算符在運行時工作。但是java不會在運行時攜帶參數化類型信息。它們在編譯時被擦除。因此錯誤。
你總是可以做到這一點,而不是
try
{
if(obj instanceof ArrayList<?>)
{
if(((ArrayList<?>)obj).get(0) instanceof MyObject)
{
// do stuff
}
}
}
catch(NullPointerException e)
{
e.printStackTrace();
}
什麼樣,如果它是空的 –
@RafaelRuiz我想簡單的try/catch投向右ArrayList類型
你總是可以做到這一點
創建一個類
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);
這就夠了:
if(obj instanceof ArrayList<?>)
{
if(((ArrayList<?>)obj).get(0) instanceof MyObject)
{
// do stuff
}
}
事實上,左操作數instanceof
檢查是否是null
與否,並返回false
如果它實際上是null
。
所以:無需趕上NullPointerException
。
這不是更適合對原始帖子發表評論嗎? – Greg
您可以使用
boolean isInstanceArrayList = tempVar.getClass() == ArrayList.class
谷歌:「Java類型擦除」 – jjnguy