[英]check if item is instance of a generic class
public class Test<T>{
public boolean isMember(T item) {
if(item instanceof Test)
{
return true;
}
return false;
}
}
這是檢查項目是否是類的實例的正確方法嗎?
我進行了一些搜索,似乎對於通用類,這行不通。
目前還不清楚您要在這里測試什么,但這里有一些可能性:
item
是T
嗎? 是的。 否則,它可能無法傳遞到isMember
方法中。 編譯器會禁止它。 (請參閱下面評論中亞歷克斯的警告。) item
是Test
嗎? 您isMember
方法將對此進行測試,但我在這里感覺到代碼的味道。 為什么您希望T
也是Test
,但只是在某些時候? 您可能需要重新考慮如何組織課程。 另外,如果這確實是您想要的,那么您的方法可以寫為:
public boolean isMember(T item) { return (item instanceof Test); }
這就引出了一個問題:首先為什么要使用這樣的方法? 哪個更容易寫?
if(obj instanceof Test) {...}
要么
if(Test<Something>.isMember(obj)) {...}
我認為第一個更簡單,大多數 Java 開發人員會比自定義方法更容易理解它的含義。
item
是Test<T>
嗎? 在運行時無法知道這一點,因為 Java 使用擦除來實現泛型。 如果這是您想要的,您將必須修改方法簽名,以類似於 Mike Myers 的示例。
T
不是變量,而是在運行時定義的類的占位符。 泛型是一個編譯時特性,因此它們在編譯時添加檢查,這在運行時可能沒有任何意義。 我們只能檢查運行時引用的對象的類型,它可能是代碼中的超類類型。 如果我們想將類型T
作為參數傳遞給方法,我們所要做的就是像下面這樣顯式地進行處理:
void genericMethod(Class<T> tClass) {
if(String.class.isAssignableFrom(tClass))
要么
void genericMethod(Class<T> tClass, T tArg) {
請注意,類型可能與此處不同,我們可以看到如何操作:
genericMethod(Number.class, 1);
public class LinkList<T>{
public boolean isMemberOfClass(T item) {
if(item instanceof LinkList)
{
return true;
}
return false;
}
}
對不起,我不支持發布問題作為答案。
LinkList 類是一個泛型類。 功能是檢查該項目是否屬於該類。 檢查是否具有相同的 T。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.