簡體   English   中英

檢查 item 是否是泛型類的實例

[英]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;
    }
}

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

我進行了一些搜索,似乎對於通用類,這行不通。

目前還不清楚您要在這里測試什么,但這里有一些可能性:

  1. itemT嗎? 是的。 否則,它可能無法傳遞到isMember方法中。 編譯器會禁止它。 (請參閱下面評論中亞歷克斯的警告。)
  2. itemTest嗎? isMember方法將對此進行測試,但我在這里感覺到代碼的味道。 為什么您希望T也是Test ,但只是在某些時候? 您可能需要重新考慮如何組織課程。 另外,如果這確實是您想要的,那么您的方法可以寫為:

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

    這就引出了一個問題:首先為什么要使用這樣的方法? 哪個更容易寫?

     if(obj instanceof Test) {...}

    要么

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

    我認為第一個更簡單,大多數 Java 開發人員會比自定義方法更容易理解它的含義。

  3. itemTest<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM