2012-08-28 41 views
9
public class Test<T>{ 

    public boolean isMember(T item) { 

     if(item instanceof Test) 
     { 
      return true; 
     } 
     return false; 
    } 
} 

這是檢查項目是否爲類實例的正確方法?檢查項是否是通用類的實例

我經歷了一些搜索,似乎對於一個泛型類,這是行不通的。

+6

您是否試圖測試該項目是否是'Test'的實例,'T'的實例,還是'Test '的實例? – StriplingWarrior

+0

@NinjoeQuah查看我的回答 – GingerHead

回答

5

目前還不清楚你想要在這裏測試什麼,但這裏有幾種可能性:

  1. item a T?是。否則,它可能無法傳入isMember方法。編譯器會禁止它。 (請參閱下面評論中的Alex的警告。)
  2. item a Test?你寫的isMember方法會測試這個,但我在這裏感受到代碼味道。你爲什麼期望T也是Test,但只有一些時間?你可能想重新考慮你如何組織你的課程。此外,如果這真的是你想要的,那麼你的方法可以寫成:

    public boolean isMember(T item) { 
        return (item instanceof Test); 
    } 
    

    這引出了一個問題:爲什麼擺在首位這樣的方法?哪個寫起來更容易?

    if(obj instanceof Test) {...} 
    

    if(Test<Something>.isMember(obj)) {...} 
    

    我認爲,第一個是簡單的,和大多數Java開發人員會明白這意味着什麼比一個自定義的方法更容易。

  3. item a Test<T>?在運行時無法知道這一點,因爲Java使用擦除來實現泛型。如果這是你想要的,你必須修改方法簽名,就像Mike Myers的例子。

+2

「編譯器會禁止它。」 - 假設你在所有類的引用中使用了正確的通用簽名,這是真的。您仍然可以使用對原始類型「Test」的引用來將不是「T」實例的項傳遞給「isMember」,但是如果您這樣做,編譯器會向您發出各種警告。 – Alex

0

T不是一個變量,而是一個在運行時定義的類的佔位符。泛型是編譯時功能,因此他們在編譯時添加檢查,這在運行時可能沒有任何意義。我們只能檢查在運行時引用的對象的類型,它可能是代碼中的超類類型。如果我們想通過類型T作爲參數傳遞給方法,我們所要做的就是明確地接近這樣的:

void genericMethod(Class<T> tClass) { 
    if(String.class.isAssignableFrom(tClass)) 

void genericMethod(Class<T> tClass, T tArg) { 

注意,類型可能不是同樣在這裏我們可以看到如何操作:

genericMethod(Number.class, 1); 
0

公共類鏈表{

public boolean isMemberOfClass(T item) { 

    if(item instanceof LinkList) 
    { 
     return true; 
    } 
    return false; 
} 

}

對不起,我不是suppost張貼問題的答案。

該類LinkList是一個泛型類。 該功能是檢查項目是否屬於該類。檢查是否有相同的T.