簡體   English   中英

你如何在java中調用泛型類型的方法?

[英]How do you call a method of a generic type in java?

我正在嘗試創建一個方法,它將變量對象類型作為參數,然后根據傳遞的對象更新數據庫,有點像 Petapoco 對 C# 的工作方式。 為此,我嘗試使用通用方法,其中傳遞的對象在插入/更新到其相關表之前通過了許多檢查。 Stack Overflow 上的許多問題都指向我使用這樣的方法簽名:

public <T> void upsertObject(Class<T> objectClass, T actualObject) { }

在方法中,我希望能夠調用像actualObject.getId()這樣的方法,但編譯器需要知道對象的實際類型才能調用其相關方法。 有沒有辦法解決? 我將如何實現這些呼叫?

編輯:

編輯為更清晰

添加一個用於綁定 T 的接口后,我發現我收到了錯誤:

“無法從 CycleComponent 類型中靜態引用非靜態方法 getId()”

該方法現在看起來像這樣,錯誤行在 T.getId() 下

public <T extends CycleComponent> void upsertObject(Class<T> objectClass, T fitProObject) {
    if (objectClass.getName() == "Cycle") {
        if (isInserted(T.getId(), "Cycles")) {
            // update the database
        }else {
            // insert into the database
        }
    }

}

界面看起來像:

public interface CycleComponent {

    String getId();

}

Cycle 類中的方法如下所示:

public String getId() {
    return this.cycleId;
}

您可以使用泛型類型邊界來實現。

定義:

public <T extends SomeType> void upsertObject(Class<T> objectClass, T actualObject) { }

SomeType是一個類或接口,你就可以調用的方法SomeTypeactualObject實例。

這將限制此方法僅用於擴展SomeType (如果它是一個類)或實現SomeType (如果它是一個接口)的類型。

例如:

public interface SomeType {
    String getId();
}

和:

public <T extends SomeType> void upsertObject(Class<T> objectClass, T actualObject) {
    if (actualObject.getId() != null) {
       ...
    }
}

假設這不必是絕對通用的(例如,向上插入java.lang.Integer可能沒有意義,對嗎?),我將定義一個包含您需要的所有方法的接口,並添加通用分類:

public interface Upsertable {
    int getID();

    // Other methods you may need...
}

public <T extends Upsertable> void upsertObject(Class<T> objectClass, T actualObject) { }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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