![](/img/trans.png)
[英]Java: How do you enforce a class type parameter to be the same as generic type specified in a generic method?
[英]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
是一個類或接口,你就可以調用的方法SomeType
在actualObject
實例。
這將限制此方法僅用於擴展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.